这真的取决于由Entity3
存的名单是否设置为级联操作,如PERSIST
,MERGE
和DELETE
。
如果列表配置为级联,那么所有你需要做的是:
- 设置的
Entity4
父。
- 将
Entity4
添加到其父项列表并合并修改的父项。
如果未配置级联,那么你需要做的:
- 设置的
Entity4
父。
- 坚持新创建的实例
Entity4
。
- 将
Entity4
添加到其父项列表并合并修改的父项。
现在你可能会问,为什么Entity4
的母公司必须更新列表并随后在两种情况下合并?
这是为了确保关联的两侧都正确更新并正确指向彼此。它很有可能考虑到关联的父节点已经加载到持久化上下文中的情况,因此将该子节点添加到数据库不会刷新,并且对于已加载的实体可见,除非刷新它。在这种情况下,最简单的解决方案是始终正确修改双方。
public class ParentEntity {
// add child to the parent entity, maintains association
public void addChild(ChildEntity child) {
if (child.getParent() != null) {
child.getParent().removeChild(child);
}
child.setParent(this);
children.add(child);
}
// remove child from parent, disassociates association
public void removeChild(ChildEntity child) {
if (this.equals(child.getParent())) {
child.setParent(null);
children.remove(child);
}
}
}
我经常发现它有助于揭露辅助方法,就像上面我的域模型,使我的代码并不需要与需要维护的关联有关。我也可能会让父实体列表的setter成为私有的,这样只有Hibernate才能使用它,以便强制严格使用addChild
/removeChild
方法。
到目前为止你做了什么?分享你的代码 – FuSsA