小编Ada*_*rod的帖子

Hibernate:通过一个查询删除所有孩子

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;
}
Run Code Online (Sandbox Code Playgroud)

当我删除父对象时,所有子对象都按预期删除,但每个子对象都被单独删除。在我的应用程序中,父级可能有数千个子级,因此出于性能原因,我需要使用单个查询一次将它们全部删除。

可能的解决方法

  1. DELETE FROM child WHERE parent_id = ?在删除父级之前手动执行我自己的 HQL 查询。这里的缺点是我(和任何其他开发人员)必须记住调用该方法。另外,它基本上绕过了级联删除。
  2. 允许级联删除发生在数据库级别。由于数据在幕后发生变化,我假设我需要记住手动.clear()设置子集合以防止 Hibernate 和数据库之间的差异。

编辑:我看到旧版本的 Hibernate 曾经具有一次性删除的概念,但我在最新版本的文档中找不到任何类似的内容。那个功能被删除了?

java orm hibernate cascade parent-child

5
推荐指数
1
解决办法
5347
查看次数

标签 统计

cascade ×1

hibernate ×1

java ×1

orm ×1

parent-child ×1