JPA - 设置双向关系 - >从OneToMany-Collection加载所有元素的开销很大?

时间:2013-07-24 21:31:40

标签: java hibernate jpa orm

考虑以下课程。 Parent类包含OneToMany关系中的Child类列表。如果我想建立双向关系,我必须将子项添加到父项的子项列表中,并将父项设置为子项。

要将子项添加到父项的子项列表中,我首先必须加载所有子项的列表。如果我有一个很大的孩子名单,我认为这是一个很大的开销,我实际上并不需要孩子们。

查看示例代码。我可以对此进行优化,还是已经为这种操作优化了JPA?

在这个例子中,我跳过了EntityManager代码,但我认为代码应该做的很清楚。

这是Child类:

@Entity
public class Child {

    Parent parent;

    @ManyToOne
    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }
}

这是Parent类:

@Entity
public class Parent {


    List<Child> children;

    @OneToMany(mappedBy = "parent")
    public List<Child> getChildren() {
        return children;
    }

    public void setChildren(List<Child> children) {
        this.children = children;
    }
}

这个类设置了双向关系。

public class Tester {


    public static void main(String[] args) {

        // in a real application i would load that from the 
        // DB and it would maybe have already a lot of children
        Parent parent = new Parent(); 
        Child child = new Child(); //

        // Set bidirectional relation
        // Isn't this line a lot of overhead -> need to load all the children just to add an additional one?
        parent.getChildren().add(child); 
        child.setParent(parent);
    }
}

2 个答案:

答案 0 :(得分:2)

没有来设置关联的另一面。您需要知道,如果此集合已经加载,或者在完成刷新之前加载了它,那么它将处于不一致状态。

但通常情况下,您只需在事务中将父项添加到父项,而不执行任何其他操作,在这种情况下,更新集合是无用的。

如果集合太大,则关联不应该是双向的。

答案 1 :(得分:0)

如果组合太大,那么您应该将获取类型映射到lazy并仅在需要子项时调用获取子项(通过在会话中调用getter方法)... 或者去单向映射...