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

标签 java hibernate orm jpa jpa-2.0

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

Caused by: java.sql.SQLException: integrity constraint violation: foreign key no action; FKCEC6E942485388AB table: PERSON_EMAIL

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

最佳答案

我将让您解释 JPA 2.0 规范中提到批量删除操作不是级联的部分:

4.10 Bulk Update and Delete Operations

...

A delete operation only applies to entities of the specified class and its subclasses. It does not cascade to related entities.

事实上,Hibernate 也不会将删除级联到集合表。这已在 HHH-5529 中报告并且建议的方法是:

You could also (a) clean up the collection table yourself or (b) use cascading foreign keys in the schema.

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

关于java - 使用元素集合时如何在 JPA 中进行批量删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3903202/

相关文章:

java - 内角的余弦定律

java - 为什么 HQL-Query 中的参数替换失败但 native 类型成功?

java - 在 Apache Logger 中将 Object[] 转换为字符串

spring - Hibernate 返回 PersistentBag 而不是 List

java - Hibernate 两父一子映射

php - ORM 查询结果 : Arrays vs Result handle wrapped in Iterator interface

java - 直接在屏幕上绘图

java - 将自定义类对象添加到显示歧义的列表

java - 将数据写入字符串

python - Django ORM : Ordering w/aggregate functions — None special treatment