当前位置: 首页 > 面试题库 >

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

顾均
2023-03-14
问题内容

我现在急切地尝试删除涉及各种关系的实体(仅@ManyToOne)-但是,Hibernate不会删除任何内容-
在调用em.remove所有内容后保持不变。

我有5个实体(E1 - E5),E6像这样引用所涉及的实体():

@Entity
public 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));

但是什么都没有。状态保持不变。

因此,我尝试添加一个@PreRemovehtml" target="_blank">方法以在删除实体之前清除所有关系…方法永远不会被调用

我尝试了各种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。恢复我刚刚删除的集合中的条目, 因为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%准确地解释所有内容,但至少可以通过来回更改代码来重现并解决此问题。



 类似资料:
  • 我目前正在努力删除一个实体,它涉及到各种关系(只有< code > @ ManyToOne )——然而,Hibernate不删除任何东西——在调用< code>em.remove之后,一切都保持不变。 我有5个实体(< code>E1 - E5),引用问题中的实体(< code>E6)如下: 本身有相反的关系: (省略了id、附加列等...) 每当我调用< code > em . remove(i

  • 问题内容: 我有以下通常正常工作的代码: 对于我的许多实体类来说,这都是可行的。但是对于其中的两个它什么也不做,它不会引发任何异常,也不会删除该对象。来自hibernate的日志显示,hibernate执行了许多选择查询,但它甚至没有尝试执行删除。 我已经在这里和这里尝试了在其他类似问题中发现的建议,但是没有用(嗯,后者建议我不能使用,但是我只是在和之间加上了语句)。 我似乎找不到这两个类比其他类

  • 我有以下通常运行良好的代码: 对于我的许多实体类,这很有效。但是,对于其中两个,它什么都不做,它不会引发任何异常,也不会删除对象。来自Hibernate的日志显示Hibernate执行了许多选择查询,但它甚至不会尝试执行删除。 我已经尝试了在这里和这里的其他类似问题中找到的建议,但无济于事(好吧,后者建议我不能使用,但我只是将语句括在和之间)。 我似乎找不到这两个班比其他班多(或少)什么。他们使用

  • 我正在使用 netbeans 并从数据库生成实体类。我所有插入和更新实体的合并调用都运行良好,但是当我尝试删除实体时,它不会将其从数据库中删除,也不会引发异常。有人可以帮我解决。我的代码如下: AbstractFacade.java AccountEntity.java DealerEntity.java

  • 删除父实体时,我还想删除关联的子实体(从数据库中)。我试图在删除时使用级联,如下所示,但我一定做错了什么。 当对父实体对象调用删除时,我收到错误消息:“该实体仍在数据库的其他地方引用”。我可以确认该实体在数据库的其他地方引用的唯一地方是在下面的两个表中(如果我手动从数据库中删除子行,对父实体对象的删除调用工作正常)。在过去的9个小时里,我一直在阅读实体对象并尝试不同的东西。我做错了什么? 这是我的

  • 问题内容: 我试图通过执行以下循环来获取TreeMap的前10个元素: 该打印 工具,为什么可能不起作用? 更新 这是我的实现: 更新 这很有用:Java Map按值排序。 问题答案: public int compare(Integer a, Integer b) { if (base.get(a) >= base.get(b)) { return -1; } else { return 1;