Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate以错误的顺序执行删除级联_Java_Hibernate_Jpa_Orm_Hibernate Mapping - Fatal编程技术网

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

Java Hibernate以错误的顺序执行删除级联,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,My Db正在抛出约束冲突(FK),因为Hibernate以错误的顺序执行级联删除 详情: 我删除了一个成员,该成员有一个钱包和钱包交易(值类型),并且钱包交易与产品有关联,就像该成员包含产品集合一样(请参见下面的Hibernate映射) 我删除了一个成员实例,并希望Hibernate同时删除产品和钱包交易。似乎它首先删除了产品实例(通过级联),因此数据库抛出了FK冲突,因为它仍然被钱包交易引用,但尚未删除(通过级联) 我使用了cascade设置,比如所有delete-orphan(在产品上)等

My Db正在抛出约束冲突(FK),因为Hibernate以错误的顺序执行级联删除

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

我删除了一个成员实例,并希望Hibernate同时删除产品和钱包交易。似乎它首先删除了产品实例(通过级联),因此数据库抛出了FK冲突,因为它仍然被钱包交易引用,但尚未删除(通过级联)

我使用了cascade设置,比如所有delete-orphan(在产品上)等等,但是运气不好 我还清空了钱包交易并刷新了同一删除交易中的hibernate会话,但也出现了相同的错误

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

hibernate映射(我遗漏了PK和属性等不重要的部分):


如果清空钱包交易并希望将其删除,则必须在交易关系中设置删除孤立项

如果产品仍然是先删除的,您可以在从交易集中删除wallet tx后刷新,这将起作用,但这肯定不是最先进的方式

否则,您可以尝试映射产品-事务-一个事务的关系,并在其上设置删除级联(使用反向),因此产品删除将首先触发事务删除。

而不是:

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

你应该:

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


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

这里回答了这个问题:谢谢orzech,我知道这篇文章,但它并没有解决我的问题。xml映射中的“产品-事务-oneToMany”映射看起来如何?我已经尝试过的其他选项不起作用(交易中的孤立删除不会更改产品的第一次删除)。谢谢。很抱歉回答晚了。我正忙于解决许多其他的bug。目前我似乎无法重现这个问题,有点令人沮丧:(我扩展了单元测试以很好地表示所描述的问题,但没有运气。如果它出现,我当然会回到这个问题上。目前它正在处理上面的映射,而没有首先清空事务集合。在日志中,我注意到它正以正确的顺序生成sql查询。顺便说一句:我以前尝试过你的建议,但当时没有解决问题。对不起。问题再次出现,我正在尝试解决它,但没有运气。你的解决方案不起作用,不知道为什么,可能是因为从产品到成员的额外链接,奇怪……有什么想法吗?但它是可嵌入的,你没有双向关联。我解决了它:我正在制作包含的集合null而不是空的,以便Hibernate无法再跟踪它。类似于此问题:@edbras您应该将此评论作为答案并接受它
<set name="transactions" table="wallet_tx" cascade="all">
<set name="transactions" table="wallet_tx" cascade="all-delete-orphan">