gpt4 book ai didi

java - 如何自动删除子实体?

转载 作者:行者123 更新时间:2023-12-02 06:36:24 25 4
gpt4 key购买 nike

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

示例:

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 View 中执行此操作)来显示 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 约束支持的详细信息。

关于java - 如何自动删除子实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19607954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com