删除父项和所有子项

时间:2010-06-30 15:18:47

标签: java hibernate orm jpa foreign-keys

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

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:更新或删除表”父“违反外键约束”fk2f04da924aeb47d8“在表”子“”。是不是可以级联所有孩子的删除?你应该如何清除表格呢?

1 个答案:

答案 0 :(得分:1)

批量删除操作不是级联的。从JPA 1.0规范:

  

4.10批量更新和删除操作

     

(...)

     

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

     

(...)

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

另一种选择是循环父实体并调用em.remove()(并且级联可以工作)。

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