使用元素集合时,如何在JPA中进行批量删除?

2022-09-03 05:17:56

Person对象包含使用@ElementCollection存储的数据时,我无法弄清楚如何使用JPA对Person对象进行批量删除。关于如何做到这一点的任何想法将不胜感激。

@Entity
@Table(name="at_person")
public class Person implements Comparable<Person> {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    private long id = 0;

    @Column(name="name", nullable = true, length = 128)
    private String name = "";

    @ElementCollection
    @Column(name = "email")
    @CollectionTable(name = "person_email", joinColumns = @JoinColumn(name = "person_id"))
    private Set<String> email = new HashSet<String>();
}

我现在正在做的是这个,它失败,有一个外键约束错误:

Query query=em.createQuery("DELETE FROM Person");

由以下原因引起: java.sql.SQLException: 完整性约束违规: 外键无操作;FKCEC6E942485388AB 表格: PERSON_EMAIL

如果它可以是一个纯粹的JPA注释而不是一个Hibernate注释,那将是一个奖励!


答案 1

我来让你解释 JPA 2.0 规范中提到大容量删除操作不是级联的部分:

4.10 批量更新和删除操作

...

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

事实是,Hibernate也不会将删除级联到集合表中。HHH-5529中已经报告了这种情况,建议的方法是:

您还可以 (a) 自行清理收集表,或 (b) 在架构中使用级联外键。

换句话说,(a)使用本机SQL或(b)在数据库级别使用级联删除约束 - 并且您必须手动添加它,我认为您不能@OnDelete与注释一起使用(与HHH-4301 IMO相同)。@ElementCollection


答案 2

推荐