Hibernate 休眠父/子关系

Hibernate 休眠父/子关系,hibernate,parent-child,Hibernate,Parent Child,我想知道为什么如果我有一个父子关系,并且想将一个子项添加到父项中,那么设置子项的父项并将子项添加到父项中是不够的 Parent parent = new Parent(); Child child = new Child(); child.setParent(parent); // Why the next line? parent.getChild().add(child); 仅设置子对象的父对象,并将一对多的关系标记为inverse=“true”是不够的?请查看。如果您的映射包含hibe

我想知道为什么如果我有一个父子关系,并且想将一个子项添加到父项中,那么设置子项的父项并将子项添加到父项中是不够的

Parent parent = new Parent();
Child child = new Child();
child.setParent(parent);

// Why the next line?
parent.getChild().add(child);

仅设置子对象的父对象,并将一对多的关系标记为inverse=“true”是不够的?

请查看。如果您的映射包含hibernate需要的所有内容,只需设置父级就足够了。该线程中的答案还解释了所有缓存对象也不会更新,并提供了一个解决方案。

最后一行并不是绝对必要的。Hibernate使用所有者端(本例中为子端)来了解是否必须持久化关联

但是,它并不关心您是否初始化了另一端,也不会为您这样做。因此,例如,如果此方法碰巧将父对象返回到GUI,GUI将获得一个父对象,而其子对象列表中没有新的子对象。类似地,如果此代码片段只是较长事务的一小部分,则事务中的其余代码将不会在子项列表中看到新的子项,因为无法保持对象图的一致性

因此,除非此代码位于外观中,并且在执行此代码段后从未使用父级,否则您应该初始化两侧。如果您知道自己在做什么,并且您知道父级将超出范围,不被使用,并且在这个代码片段之后会被垃圾收集,那么只初始化拥有方就足够了。但请记住,会话缓存本身会保留对父级的引用,直到会话关闭