TL; DR:是否可以配置Hibernate使用单个删除查询删除所有子对象?休眠:使用一个查询删除所有子项
全部问题:我在休眠5.1定义了以下父/子关联:
public class Parent {
@OneToMany(fetch = FetchType.EAGER, mappedBy = "parent", cascade = CascadeType.REMOVE)
private List<Child> children;
}
public class Child {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "parent_id", nullable = false)
private Parent parent;
}
当我删除父对象,所有子对象被删除,如预期,但每一个都被单独删除。在我的应用程序中,父母可能有成千上万的孩子,所以出于性能方面的原因,我需要使用一个查询来一次删除所有孩子。
可能的解决方法
- 手动执行我自己的HQL查询,
DELETE FROM child WHERE parent_id = ?
,删除父之前。这里的缺点是我(和任何其他开发人员)必须记得调用该方法。此外,它基本上绕过了级联删除。 - 允许级联删除发生在数据库级别。由于数据在幕后发生变化,我假设我需要记住手动收集子集合以防止Hibernate和数据库之间的差异。
编辑:我看到Hibernate老的版本中使用有one-shot delete的概念,但我无法找到最新版本的文档中类似的事情。该功能已被删除?
谢谢,这是有道理的。如果我在数据库中添加级联删除会导致Hibernate的缓存问题? –