删除父级和所有子级

Posted

技术标签:

【中文标题】删除父级和所有子级【英文标题】:Removing parent and all children 【发布时间】:2010-06-30 15:18:46 【问题描述】:

我在从数据库中删除父实体时遇到问题。代码如下所示:

public class Parent implements Serializable 
  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private Long id;  

  @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinColumn(name="parentId")
  private Set<Child> children = new HashSet<Child>();


public class Child implements Serializable 
  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private Long id;  

  private String name;



Query q = em.createQuery("delete from Parent");
q.executeUpdate();

但我收到“错误:表“父”上的更新或删除违反了表“子”上的外键约束“fk2f04da924aeb47d8”。不能级联删除所有孩子吗?否则应该如何清理表格?

【问题讨论】:

【参考方案1】:

批量删除操作没有级联。来自 JPA 1.0 规范:

4.10 批量更新和删除操作

(...)

删除操作仅适用于 指定类的实体和 它的子类。它不会级联到 相关实体。

(...)

因此,如果您想使用批量删除,则必须“手动”处理关系(即首先删除相关实体)。

另一种选择是在父实体上循环并调用em.remove()(并且级联将起作用)。

选择其中一个选项将取决于要删除的实体数量和预期性能。

【讨论】:

所以你的意思是我必须加载所有父对象(以及所有子对象和子对象的子对象)才能删除它们?! 难道不能要求 JPA (Hibernate) 重新创建所有表吗?它可以在应用程序服务器启动时执行,那么为什么不运行时呢?或者截断什么的? @Peter 我从来没有说过不可能重新创建所有表,这只是一个完全不同的问题(重新创建所有表与删除一个表)。您可以为此使用SchemaExport。看到这个previous answer。

以上是关于删除父级和所有子级的主要内容,如果未能解决你的问题,请参考以下文章

Java MySQL递归子级父级,构建树结构

在一个查询中保存父级和子级(子级对父级有空值引用)

完整的二叉树交换子级和父级错误

找到堆的父级和子级的方程式背后的直觉是啥?

在 Laravel 中为父级和子级创建活动类

php facetwp索引仅限父级和一级子级条款