linux hibernate 不工作,Hibernate EntityManager:删除引用的实体不工作

我想出了问题 – 实际上有两个问题:(如果有人遇到类似的问题,请留下这里)

正如我所提到的,删除应该发生在ajax请求中.因此,简单的呼唤

em.remove(instanceOfE6);

导致java.lang.IllegalArgumentException:删除分离的实例异常.所以,我尝试了使用merge的方法:

em.remove(em.merge(instanceOfE6));

这没有产生错误 – 但简单不起作用.我启用了hibernate的跟踪日志记录,如本文所述:JPA/Hibernate remove entity sometimes not working以找出问题所在,实际上,尝试删除实体导致:

TRACE [org...DefaultPersistEventListener] un-scheduling entity deletion ...

显然,要删除的实体仍然连接到其他实体,这导致hibernate中止删除的问题,所以我试图在删除之前删除关系.

从E6的示例中可以看出,我使用了@ManyToOne(optional = false),这意味着我无法将传出引用设置为null,否则在调用merge时会导致异常.

我第一次尝试清理关系只是“清理集合”,因为我认为不需要清理我要删除的实体的传出关系.事实并非如此,但稍后我将详细介绍这一点:

所以,代码现在看起来像

instanceOfE6.getE1().getE6s().remove(instanceOfE6);

instanceOfE6.getE2().getE6s().remove(instanceOfE6);

instanceOfE6.getE3().getE6s().remove(instanceOfE6);

instanceOfE6.getE4().getE6s().remove(instanceOfE6);

instanceOfE6.getE5().getE6s().remove(instanceOfE6);

em.remove(em.merge(instanceOfE6));

同样的问题:删除中止.我错过了一个明显的事实,即调用merge会ofc.恢复刚删除的集合中的条目,因为instanceOfE6 STILL在其他实体上没有可空的引用.因此删除再次中止.

最后是解决方案.是在删除引用和最终删除之前进行合并:

if (!em.contains(instanceOfE6)){

instanceOfE6 = em.merge(instanceOfE6);

}

instanceOfE6.getE1().getE6s().remove(instanceOfE6);

instanceOfE6.getE2().getE6s().remove(instanceOfE6);

instanceOfE6.getE3().getE6s().remove(instanceOfE6);

instanceOfE6.getE4().getE6s().remove(instanceOfE6);

instanceOfE6.getE5().getE6s().remove(instanceOfE6);

em.remove(instanceOfE6);

我不太确定我是否100%准确地解释了所有内容,但至少我可以通过来回更改代码来重现并修复问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值