java - Hibernate 以错误的顺序执行删除级联

标签 java hibernate jpa orm hibernate-mapping

我的 Db 抛出约束违规 (FK),因为 Hibernate 以错误的顺序执行级联删除。

详细信息: 我删除了一个成员(member),它有一个钱包和钱包交易(值类型),并且钱包交易与产品有关联,就像成员(member)包含产品集合一样(参见下面的 Hibernate 映射)。

我删除了一个 Member 实例,并希望 Hibernate 删除产品和电子钱包交易。它似乎首先删除了产品实例(通过级联),这样数据库就会抛出 FK 违规,因为它仍然被钱包交易引用,但尚未删除(通过级联)

我玩过级联设置,比如 all-delete-orphan(在产品上)等等...,但没有成功 我还清空了钱包交易并在同一个删除交易中刷新了 hibernate session ,但也出现了同样的错误。

请理解并帮助获得正确的级联删除顺序?

hibernate 映射(我省略了不重要的部分,如 PK 和属性):

<class name="Member" table="mem" >
 <component name="wallet" class="Wallet">
  <set name="transactions" table="wallet_tx" cascade="all">
   <cache usage="read-write" />
   <key column="idTaxer" not-null="true" />
   <composite-element class="WalletTransaction">
    <property name="amount" type="big_decimal" column="amount" />
    <many-to-one name="product" column="idPrdInst" class="Product" cascade="none" />
   </composite-element>
  </set>
 </component>

 <set name="products"  cascade="delete" inverse="true">
  <key column="idTaxer" not-null="true" />
  <one-to-many class="Product" />
 </set>
</class>

<class name="Product" table="prd" >
 ...
 <many-to-one name="member" column="idMember" class="Member" cascade="none" />
</class>

数据库错误:

ERROR:  update or delete on table "prd" violates foreign key constraint "fk_1umej7" on table "wallet_tx"
DETAIL:  Key (id)=(75bef42fc4544) is still referenced from table "wallet_tx".

最佳答案

如果您清空钱包交易并希望它被删除,您必须在交易关系上设置 delete-orphan。

如果产品仍然被第一次删除,您可以在从交易集中删除钱包 tx 后刷新,它会起作用,但肯定不是最先进的方法。

否则,您可以尝试映射产品 - 交易 oneToMany 关系并在其上设置删除级联(使用反向),产品删除将首先触发交易删除。

关于java - Hibernate 以错误的顺序执行删除级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24011759/

相关文章:

java - 来自根路径的 Zuul 路由

java - Setter 仅在 setter 范围内更改字段的值

java - Hibernate在保存大量实体时导致内存不足异常

java - Hibernate - 无法在 SQLQuery 上设置命名参数

java - 有没有办法将 HibernateException 转换为其他内容,然后将 Spring 中的 DataAccessException 转换为其他内容

java - Oracle 查询到 JPA 查询转换

java - 使用 JPA 和 Oracle 管理具有增量 ID 的复合主键

c# - 在C#中获取java包的可用函数/方法

java - 如何使用 POST 将 Array 发送到 REST-Service (Jersey)

java - 从子类访问父类的私有(private)实例变量?