【发布时间】:2012-05-08 20:33:21
【问题描述】:
我有一个应用程序通过休眠加载对象,然后将这些对象作为分离对象传递到另一层。对这些对象的任何更改都会发送回休眠层,我在这些对象上调用saveOrUpdate()。
如果我只是在调用saveOrUpdate() 之前从集合中删除子对象,休眠将删除传递给saveOrUpdate() 的对象中的集合中包含的一对多关系子对象吗?
如果不是,那么这通常如何在使用分离对象的休眠应用程序中完成?
【问题讨论】:
我有一个应用程序通过休眠加载对象,然后将这些对象作为分离对象传递到另一层。对这些对象的任何更改都会发送回休眠层,我在这些对象上调用saveOrUpdate()。
如果我只是在调用saveOrUpdate() 之前从集合中删除子对象,休眠将删除传递给saveOrUpdate() 的对象中的集合中包含的一对多关系子对象吗?
如果不是,那么这通常如何在使用分离对象的休眠应用程序中完成?
【问题讨论】:
如果我在调用
saveOrUpdate()之前简单地从集合中删除子对象,休眠将删除传递给saveOrUpdate()的对象中包含在集合中的一对多关系子对象吗?
不,默认情况下不是。在这种情况下,此类子对象被称为“孤儿”,假设某些其他实体也没有对它们的引用。
这在文档中进行了讨论,11.11. Transitive persistence:
一种特殊的级联样式
delete-orphan仅适用于一对多关联,并指示应将delete()操作应用于从关联中删除的任何子对象。使用注释没有CascadeType.DELETE-ORPHAN等价物。相反,您可以使用如示例 11.4 中所示的属性 orphanRemoval,“@OneToMany和orphanRemoval”。 如果从@OneToMany集合中删除一个实体,或者从@OneToOne关联中取消引用一个关联实体,如果orphanRemoval设置为true,则可以将此关联实体标记为删除。。 p>
【讨论】:
@JoinColumn 只是用来覆盖默认的连接列名。看来Hibernate并不认为自己是孤儿。您确定其他实体没有引用该孩子吗?
默认情况下不会。您可以使用@Cascade(CascadeType.DELETE_ORPHANS) 来实现。
【讨论】: