栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Hibernate EntityManager:删除引用的实体不起作用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate EntityManager:删除引用的实体不起作用

我发现了问题-实际上有两个问题:(如果有人偶然发现类似问题,请留在这里)

正如我提到的,删除应该在ajax请求中发生。因此,简单的调用

em.remove(instanceOfE6);

导致

java.lang.IllegalArgumentException: Removing a detachedinstance
异常。因此,我尝试了使用merge的方法:

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

不会产生错误-但是简单行不通。如这篇文章中所述,我为hibernate启用了跟踪日志记录:JPA /
Hibernate移除实体有时无法找出问题所在,实际上,尝试移除该实体会导致:

 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
。恢复我刚刚删除的集合中的条目, 因为instanceOfE6
STILL拥有其他实体上的不能为null的引用
。因此删除再次中止。

终于解决了。在删除引用和最终删除之前进行合并:

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%准确地解释所有内容,但至少可以通过来回更改代码来重现并解决此问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/406116.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号