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

时间:2014-06-03 09:36:13

标签: java hibernate jpa orm hibernate-mapping

我的Db正在抛出一个Constraing违规(FK),因为Hibernate以错误的顺序执行级联删除。

详细说明: 我删除了一个有钱包交易(价值类型)的会员,钱包交易与产品关联,就像会员包含产品集合一样(参见下面的Hibernate映射)。

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

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

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

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".

2 个答案:

答案 0 :(得分:1)

如果清空钱包交易并希望将其删除,则必须在交易关系中设置delete-orphan。

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

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

答案 1 :(得分:1)

而不是:

<set name="transactions" table="wallet_tx" cascade="all">

你应该:

<set name="transactions" table="wallet_tx" cascade="all-delete-orphan">

在删除成员父实体之前,只需清除事务集。