【问题标题】:How to do bulk delete in JPA when using Element Collections?使用元素集合时如何在 JPA 中进行批量删除?
【发布时间】:2011-04-23 14:58:58
【问题描述】:

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 注释,那将是一个奖励!

【问题讨论】:

    标签: java hibernate orm jpa jpa-2.0


    【解决方案1】:

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

    4.10 批量更新和删除操作

    ...

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

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

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

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

    【讨论】:

    • 嗯,我很震惊 JPA 会有如此明显的错误。这意味着如果您尝试使用 JPA 清除非常大的表中的数据,则必须逐个迭代每个对象,或者希望手动打开级联删除!也许我应该再回顾一下 JDO
    • @corydoras 我提到了这些选项。您的来电。
    • 是的,谢谢您的信息!生命太短暂了,不能花时间为应该简单的事情摆弄解决方法(:现在我们有代码迭代每个对象并手动删除它们。
    • 5529 的链接似乎已损坏...但应该可以在 hibernate.atlassian.net/browse/HHH-5529 获得
    • 无论如何,它可能是规范的一部分,但它看起来像一个巨大的限制:(如果不打算在 JPA 的下一个规范中修复,如果得到一些非标准的就好了Hibernate 中的非 JPA 命令...但是 HHH-5529 似乎自 2010 年以来就已打开...我想一个可能的解决方法是完全摆脱 ElementCollection,并将基本元素包装在它们自己的实体中(尽管我估计效率不会特别高……)
    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 2020-09-04
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    相关资源
    最近更新 更多