我有两个实体(给你简化的版本):
<createTable tableName="wallet_information"
remarks="A table to contain wallet data">
<column name="id" type="bigint(20)" autoIncrement="true">
<constraints nullable="false" primaryKey="true"/>
</column>
<column name="user_uuid" type="varchar(255)">
<constraints nullable="false"/>
</column>
<column name="wallet_name" type="varchar(255)">
<constraints nullable="false"/>
</column>
<column name="wallet_address" type="varchar(63)">
<constraints nullable="false"/>
</column>
<column name="verification_challenge_id" type="bigint(20)">
<constraints nullable="true"/>
</column>
</createTable>
还有:
<createTable tableName="verification_challenge"
remarks="A table to contain challenge data">
<column name="id" type="bigint(20)" autoIncrement="true">
<constraints nullable="false" primaryKey="true"/>
</column>
<column name="challenge_type" type="varchar(255)">
<constraints nullable="false"/>
</column>
</createTable>
最后:
<addForeignKeyConstraint baseTableName="wallet_information"
baseColumnNames="verification_challenge_id"
constraintName="verification_challenge_fk"
referencedTableName="verification_challenge"
referencedColumnNames="id"
onDelete="CASCADE"/>
然后,我使用Hibernate将一些数据持久化在这些表中。
目前,我没有从代码透视图中删除这些表中的任何数据,但是当我手动删除wallet_information
中的条目时,verification_challenge
中被引用的条目并没有随之删除。
但是当我删除verification_challenge
中的条目时,wallet_information
中引用的条目也被删除了。
我假设onDelete="CASCADE"
的行为完全相反...
我做错了什么?
2条答案
按热度按时间kq4fsx7k1#
TL;DR
我假设onDelete=“CASCADE”的行为方式完全相反...
啊...不是真的,it works,因为它应该是,在您的共享代码
这意味着,每当您删除
verification_challenge
表中的记录时,所有在删除时具有级联的关联实体(如wallet_information
)也将被删除。dzjeubhm2#
我认为您的外键设置与业务逻辑的预期相反。
从Liquibase方面来看,它只是生成类似
alter table wallet_information add constraint verification_challenge_fk ... on delete cascade
的SQL,告诉数据库“当您有一个可能导致此约束失败的删除操作时,删除有问题的数据”。因此,在您的情况下,“当您删除验证挑战时,删除钱包信息”。因此,您的修复方法应该是从
wallet_information
中删除verification_challenge_id
列,并在verification_challenge
中添加一个wallet_information_id
列,然后,onDelete=级联逻辑将与您所期望的匹配。