删除 JPA 对象由于外键约束而失败?

2022-09-04 21:33:50

为什么以下查询会由于外键约束而失败?我没有其他方法可以删除我所知道的相关数据。

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

我认为导致问题的冒犯关系是字段:activationKey

2029 [main] ERROR org.hibernate.util.JDBCExceptionReporter - integrity
constraint violation: foreign key no action; FKCEC6E942485388AB
table: ACTIVATION_KEY

这就是我现在拥有的:

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

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

    @ElementCollection
    @Column(name = "activation_key")
    @CollectionTable(name = "activation_key")
    private Set<String> activationKey = new HashSet<String>();
}

答案 1

为什么以下查询会由于外键约束而失败?

看起来批量删除查询不会从集合表中删除条目,因此会违反 FK 约束。

虽然 JPA 规范明确规定批量删除不会级联到相关实体:

4.10 批量更新和删除操作

...

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

这并不完全是你的情况,我认为你想做的事情应该得到支持。

您可能正面临着Hibernate批量删除的限制之一,例如:

我建议提出一个问题。

解决办法:使用本机查询先删除集合表,然后删除实体表。


答案 2

推荐