Hibernate EntityManager:删除引用的实体不起作用
我现在急切地尝试删除涉及各种关系的实体(仅@ManyToOne
)-但是,Hibernate不会删除任何内容-
在调用em.remove
所有内容后保持不变。
我有5个实体(E1 - E5
),E6
像这样引用所涉及的实体():
@Entitypublic class EX {
@OneToMany(mappedBy = "eX", fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REMOVE })
private Set<E6> e6s;
}
E6
本身具有相反的@ManyToOne
关系:
public class E6{ @ManyToOne(optional = false)
private E1 e1;
@ManyToOne(optional = false)
private E2 e2;
@ManyToOne(optional = false)
private E3 e3;
@ManyToOne(optional = false)
private E4 e4;
@ManyToOne(optional = false)
private E5 e5;
}
(不包括ID,其他列等)
每当我打电话时em.remove(instanceOfE6)
, 发生。我添加了Hibernate SQL-
Output,但是看不到执行DELETE
查询的单次尝试。
由于删除可能来自ajax请求和 新的 EntityManager,因此我在删除之前添加了一个调用merge,导致其他情况,我得到了 Entity
unmanaged Exception :
em.remove(em.merge(instanceOfE6));
但是什么都没有。状态保持不变。
因此,我尝试添加一个@PreRemove
方法以在删除实体之前清除所有关系…方法永远不会被调用。
我尝试了各种Cascade操作(包括Cascade.ALL
)-但由于我只需要删除并保持不变,那也应该可以正常工作。
我考虑过使用本机的Delete语句(每个实体都有一个代理ID,因此很可能会起作用)-但是由于所有事情都发生在AJAX调用中,因此我不想使用它,因为我想拥有更新了持久性缓存,而无需重新获取每个涉及的实体…
有任何想法吗?
如果您需要更多资源,请给我留言。
我还尝试从所有关系中删除有问题的实体(在对象方面),并调用em.merge()
其余实体之一,希望hibernate会鞭打未链接的实体-不走运。
回答:
我发现了问题-实际上有两个问题:(如果有人偶然发现类似问题,请留在这里)
正如我提到的,删除应该在ajax请求中发生。因此,简单的调用
em.remove(instanceOfE6);
导致java.lang.IllegalArgumentException: Removing a detached
instance异常。因此,我尝试了使用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
。恢复我刚刚删除的集合中的条目, 。因此删除再次中止。
终于解决了。在删除引用和最终删除之前进行合并:
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%准确地解释所有内容,但至少可以通过来回更改代码来重现并解决此问题。
以上是 Hibernate EntityManager:删除引用的实体不起作用 的全部内容, 来源链接: utcz.com/qa/401032.html