Hibernate的saveOrUpdate方法会删除子元素吗?

7
我有一个应用程序,通过Hibernate加载对象并将这些对象作为分离的对象传递给另一层。对这些对象进行的任何更改都会被发送回Hibernate层,在该层上调用saveOrUpdate()方法对这些对象进行保存。
如果我在调用saveOrUpdate()方法之前仅从集合中删除子对象,那么Hibernate是否会删除包含在对象集合中的一对多关系的子对象?
如果不是,那么在使用分离对象的Hibernate应用程序中通常如何完成这个任务?
2个回答

5
如果我在调用saveOrUpdate()之前从集合中简单地删除子对象,那么Hibernate会删除包含在传递给saveOrUpdate()的对象中的一对多关系子对象吗?
默认情况下不会。在这个上下文中,这些子对象称为“孤儿”,假设其他实体也没有对它们的引用。
文档中讨论了这个问题,参见11.11. Transitive persistence
一个特殊的级联样式delete-orphan仅适用于一对多关联,并指示应将delete()操作应用于从关联中删除的任何子对象。使用注释时,没有CascadeType.DELETE-ORPHAN等效项。相反,您可以使用例子11.4中看到的属性orphanRemoval,“@OneToMany with orphanRemoval”。如果从@OneToMany集合中删除实体或从@OneToOne关联中取消引用相关实体,则可以将此关联实体标记为删除,如果将orphanRemoval设置为true。

这很有道理。然而,当我在集合上设置CascadeType.ALL和orphanRemoval=true时,子对象仍然没有被删除。这可能是因为我在OneToMany注释中与JoinColumn注释一起使用的缘故吗? - Tom
@Tom:可能不是这样,@JoinColumn 只是用于覆盖默认的连接列名称。似乎 Hibernate 认为它不是孤儿。你确定其他实体没有引用该子实体吗? - skaffman
它绝对没有从另一个实体引用。然而,底层的数据库关系实际上是ManyToMany,我使用OneToMany和JoinColumn使模型更简单。也许这会引起问题?否则,我刚刚注意到一些子实体的子实体包含ManyToOne关系,这些关系不能设置orphanRemoval属性。也许这会阻止删除父实体。 - Tom

0

默认情况下,它不会这样做。您可以使用@Cascade(CascadeType.DELETE_ORPHANS)来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接