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

Java 当使用元素集合时,如何在JPA中进行批量删除?,java,hibernate,orm,jpa,jpa-2.0,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

当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>();
}
原因:java.sql.SQLException:完整性约束冲突: 外键不动作;FKCEC6E942485388AB表格:个人电子邮件


如果它可以是一个纯JPA注释而不是Hibernate注释,那将是一个额外的好处

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

4.10批量更新和删除操作

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

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

您还可以(a)自己清理集合表,或者(b)在模式中使用级联外键


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

Hmm,我很震惊JPA会有如此明显的错误。这意味着,如果您试图使用JPA清除一个非常大的表中的数据,您必须逐个迭代每个对象,或者希望手动启用级联删除!也许我应该再回头看看JDO@corydoras我提到了选项。你的电话。是的,谢谢你的信息!生命太短暂了,不能花时间去摆弄解决方案来完成一些简单的事情(:现在我们有代码迭代每个对象并手动删除它们。链接对于5529来说似乎已断开…但无论如何都应该可用,它可能是规范的一部分,但它看起来像是一个巨大的限制:(如果不打算在下一个JPA规范中得到修复,那么在Hibernate中获得一些非标准的非JPA命令就太好了……但是HHH-5529似乎是从2010年开始启用的……我猜一个可能的解决方法是完全摆脱ElementCollection,并将基本元素包装到它们自己的实体中(虽然我想这不会特别有效……)
Query query=em.createQuery("DELETE FROM Person");