移除父级及其所有子级

3

我有一个问题,无法从数据库中删除父实体。 代码如下:

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();

但是我收到了“ERROR:在表“parent”上更新或删除违反了表“child”上的外键约束“fk2f04da924aeb47d8”。是否不可能级联删除所有子项?否则应该如何清空表格?

1个回答

1

批量删除操作不具备级联功能。根据JPA 1.0规范:

4.10 批量更新和删除操作

(...)

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

(...)

因此,如果您想使用批量删除,您需要"手动"处理关联关系(即首先删除相关实体)。

另一种选择是循环遍历父实体并调用em.remove()(级联将生效)。

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


那么你的意思是我必须加载所有父对象(以及所有子对象和子孙对象),这样才能将它们删除吗?! - Peter Eriksson
JPA(Hibernate)难道不能重新创建所有的表吗?它可以在应用程序服务器启动时执行此操作,那么在运行时为什么不能这样做呢?或者是进行截断等操作? - Peter Eriksson
1
@Peter 我从未说过不可能重新创建所有表,这只是一个完全不同的问题(重新创建所有表与删除一个表)。你可以使用 SchemaExport 来实现。请参考这个之前的回答 - Pascal Thivent

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