Liquibase配置onDelete="CASCADE"级联删除方向与预期相反问题求助
问题根因
你观察到的现象完全符合你当前配置的预期,本质是你对数据库外键ON DELETE CASCADE的作用方向理解有误:
- 外键的核心逻辑是持有外键列的表(子表)引用另一张表(父表)的主键,你当前的配置中:
- 子表:
wallet_information(持有外键列verification_challenge_id) - 父表:
verification_challenge(被引用的主键id所在表)
- 子表:
ON DELETE CASCADE的标准语义是:当父表中的某行被删除时,自动删除子表中所有关联引用了该行的记录,这就是你删除挑战记录时钱包记录会同步删除,反过来删除钱包记录不会影响挑战记录的原因。
实现你预期效果的方案
你预期的「删除wallet_information记录时同步删除关联的verification_challenge记录」,可以根据你的业务逻辑选以下两种方案实现:
方案1:调整数据库外键结构(适合1个挑战仅对应1个钱包的场景)
在verification_challenge表新增wallet_id字段,将该字段设为外键指向wallet_information的id,并在这个外键上配置onDelete="CASCADE",同时删掉你现在的wallet_information表上的外键级联配置即可。
方案2:依赖Hibernate实体级联(无需调整表结构)
在WalletInformation实体类对应的关联VerificationChallenge的属性上,配置级联删除:
如果是一对一关联就加@OneToOne(cascade = CascadeType.REMOVE),如果是多对一就调整对应关联注解的cascade属性即可。Hibernate在删除钱包实体时会自动发起SQL删除关联的挑战实体,不需要依赖数据库级联能力。
注意事项
如果你的业务逻辑中1个挑战可以被多个钱包关联,不要使用上述级联方案,否则删除一个钱包会把其他钱包关联的同一个挑战也删掉,导致数据异常,这种场景建议手动编写关联删除的业务逻辑。
内容的提问来源于stack exchange,提问作者hc0re
相关产品推荐
相关产品推荐

