考虑以下课程。 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);
}
}
答案 0 :(得分:2)
您没有来设置关联的另一面。您需要知道,如果此集合已经加载,或者在完成刷新之前加载了它,那么它将处于不一致状态。
但通常情况下,您只需在事务中将父项添加到父项,而不执行任何其他操作,在这种情况下,更新集合是无用的。
如果集合太大,则关联不应该是双向的。
答案 1 :(得分:0)
如果组合太大,那么您应该将获取类型映射到lazy
并仅在需要子项时调用获取子项(通过在会话中调用getter方法)...
或者去单向映射...