当前位置: 首页 > 知识库问答 >
问题:

JPA/Hibernate删除实体有时不起作用

时经纬
2023-03-14

我有以下通常运行良好的代码:

public void delete(T object)
{
  EntityManager em = getPersistence().createEntityManager();
  EntityTransaction et = em.getTransaction();
  try
  {
    et.begin();
    object = em.find(object.getClass(), object.getId());
    em.remove(object);
    em.flush();
    et.commit();
  }
  catch(Exception e)
  {
    error("Unable to delete " + object.toString() + ": there are references to it.");
  }
  finally
  {
    if (et.isActive()) et.rollback();
    em.close();
  }
}

对于我的许多实体类,这很有效。但是,对于其中两个,它什么都不做,它不会引发任何异常,也不会删除对象。来自Hibernate的日志显示Hibernate执行了许多选择查询,但它甚至不会尝试执行删除。

我已经尝试了在这里和这里的其他类似问题中找到的建议,但无济于事(好吧,后者建议@Transactional我不能使用,但我只是将语句括在begin()commit()之间)。

我似乎找不到这两个班比其他班多(或少)什么。他们使用@PrimaryKeyJoinColumn就像我拥有的几乎所有其他实体一样,他们有@OneToMany@ManyToOne,就像ohters一样。老实说,他们确实有一个@OneToOne(可选=false)字段,它引用了另一个类,而其他实体没有,但我不会经历更改该字段(从而更改数据库html" target="_blank">模式)的麻烦,除非你告诉我这可能是有原因的。

@OneToOne有责任吗?还是我的删除代码有错误?

共有3个答案

洪飞驰
2023-03-14

在关注聚集在一起的东西时,我遇到了同样的问题。

>

  • Hibernate 3.6.10.最终版
  • 引用子项的父实体。
  • 引用父级
  • 的某些子实体。它是遗留代码。

    class ChildEntity {
      @ManyToOne(cascade = CascadeType.ALL)
      private ParentEntity parent;
    }
    

    子实体被加载到会话上下文中,然后从表中删除,而没有事务内的JPA通知(存储过程,本机sql)

    然后不能删除父级。没有删除,没有异常,只是TRACE日志中的“取消计划删除”消息。

    解决方案:我删除了级联属性。我很难找到哪个子实体阻止父级删除。另外,我不明白为什么如果我删除父实体,子级联会影响。

  • 马冯浩
    2023-03-14

    @OneToMany关联中将级联 = CascadeType.ALL 替换为 orphanRemoval = true 将得到预期的结果:子记录被正确删除,而无需删除父记录。

    遗憾的是没有更清楚地记录错误。

    唐宏壮
    2023-03-14

    在这个图中,你是否有将持久化级联回被删除的事物的关联?如果是这样的话,JPA规范明确指出,在这种情况下,提供者要取消删除。如果是这种情况,Hibernate会写出一条日志语句,说明“取消实体删除计划[...]".通过在< code > org . hibernate . event . internal . defaultpersisteventlistener 记录器上启用跟踪日志记录,您可以看到这一点。

    如果是这种情况,您需要按照JPA规范的要求清理这些关联。

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

    • 我无法使用Hibernate JPA嵌入使cascase删除在Java EE容器管理的应用程序中工作。我们将不胜感激。我有一个实体‘公司',与其他实体有四个任何关系。当测试应用程序(使用Arquillian框架)时,我无法使级联删除工作;公司实体被删除,删除后子实体仍然存在。我读到了这里:JPA和Hibernate Cascade DELETE OneToMany不起作用,这可能是一个测试问题,所

    • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应

    • 问题内容: 我现在急切地尝试删除涉及各种关系的实体(仅)-但是,Hibernate不会删除任何内容- 在调用所有内容后保持不变。 我有5个实体(),像这样引用所涉及的实体(): 本身具有相反的关系: (不包括ID,其他列等) 每当我打电话时, 什么都不会 发生。我添加了Hibernate SQL- Output,但是看不到执行查询的单次尝试。 由于删除可能来自ajax请求和 新的 EntityMa

    • 我一直在阅读一篇又一篇的帖子和文章,试图让级联删除在最新的Spring Boot版本中与JPA/Hibernate配合使用。我读过你必须使用Hibernate特定的级联,我读过你不需要。我读过它们就是不起作用,但它似乎是一个混合体。我尝试过的一切都不起作用。这种关系是双向的。 不工作: 不工作: 在删除品牌之前,除了删除税率之外,还有什么其他方法有效吗? 我的测试如下所示: 参考错误: 原因:or

    • 主要内容:JPA实体删除示例要从数据库中删除记录,可以使用接口提供方法。方法使用主键来删除特定的记录。 JPA实体删除示例 在这里,我们将演示如何根据主键删除指定学生的信息。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.