【发布时间】:2021-04-30 08:53:39
【问题描述】:
TL;DR:是否可以将 Hibernate 配置为使用单个删除查询删除所有子对象?
完整问题:我在 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 = ?。这里的缺点是我(和任何其他开发人员)必须记住调用该方法。此外,它从本质上规避了级联删除。 - 允许在数据库级别进行级联删除。由于数据在幕后发生变化,我想我需要记住手动
.clear()子集合以防止 Hibernate 和数据库之间出现差异。
编辑:我看到旧版本的 Hibernate 曾经有 one-shot delete 的概念,但我在最新版本的文档中找不到类似的东西。该功能是否已被删除?
【问题讨论】:
标签: java hibernate orm parent-child cascade