繁体   English   中英

如何自动删除子实体?

[英]How to automatically remove child entities?

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

例:

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对象?

我相信你有一个外键约束的问题。 使用像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注释之前生成了表,所以现在您将获得“外键无操作”完整性约束违规。

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

另外,请查看此内容 ,了解有关Hibernate对数据库ON DELETE CASCADE约束的支持的详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM