如何自动删除子实体?

时间:2013-10-26 14:39:50

标签: java database hibernate

我想从我的表中删除实体并让它自动删除任何属于它的实体。

示例:

class User {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", orphanRemoval=true)
    @OnDelete(action = OnDeleteAction.CASCADE)
    List<Address> addresses;
}

当我删除没有地址的用户时,一切正常。同时删除地址而不删除用户。

但是:如果我尝试删除仍有一些地址的用户,我会收到org.hsqldb.HsqlException

integrity constraint violation: foreign key no action; FK_ADDRESS_USER_ID table: ADDRESS

这里可能有什么问题? 或者这是不受支持的,我必须在删除用户之前先显式删除所有包含的Address对象吗?

1 个答案:

答案 0 :(得分:2)

我相信你的外键约束有问题。使用像Aqua Data Studio或类似工具这样的数据库工具(您也可以在IDE中,在Eclipse - Data Source Explorer视图中执行此操作),以显示ADDRESS表的创建脚本。它应该包含这样的内容:

ALTER TABLE TESTSCHEMA.ADDRESS
    ADD CONSTRAINT FK1ED033D4E91AAFD9
    FOREIGN KEY(FK_ADDRESS_USER_ID)
    REFERENCES TESTSCHEMA.USER(ID)
    ON DELETE CASCADE

重点是你案件中的ON DELETE CASCADE部分。如果缺少或不同,那可能是造成问题的原因。如果表是由Hibernate自动生成的,则此约束应该有效,但请记住,数据库之间存在差异。可能是在添加Hibernate的@OnDelete注释之前生成了表,所以现在你得到的是“外键无操作”完整性约束违规。

与此问题无关,但请注意orphanRemoval=true将尝试从数据库中删除该地址,当该地址从用户实体的集合中删除时。

另外,请检查this以获取有关Hibernate对数据库ON DELETE CASCADE约束的支持的详细信息。