0

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

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

查看示例代码。我可以优化它还是 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);
    }
}
4

2 回答 2

2

您不必设置关联的另一端。您需要注意,如果此集合已加载,或者在刷新完成之前加载,那么它将处于不一致状态。

但通常情况下,您只是在事务中将子代添加到父代,而不做任何其他事情,在这种情况下,更新集合是无用的。

如果集合如此之大,也许关联不应该是双向的。

于 2013-07-24T21:45:08.560 回答
0

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

于 2013-07-25T11:45:37.603 回答