0

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

例子:

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在删除用户之前先明确删除所有包含的对象?

4

1 回答 1

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 注释之前生成的,所以现在您遇到了“外键无操作”完整性约束违规。

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

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

于 2013-10-27T14:00:53.313 回答