【问题标题】:JPA EntityManager with Hibernate - find and remove does not delete data from database带有 Hibernate 的 JPA EntityManager - 查找和删除不会从数据库中删除数据
【发布时间】:2013-10-03 15:34:11
【问题描述】:

无法让以下代码正常工作...

我有一个 JpaTransactionManager txManager 自动连接到这个测试中。我知道 ID 为 39 的记录确实 存在。它仍然存在于交易结束时,也是......

    TransactionStatus status = txManager.getTransaction(def);
    A a = mock(A.class);
    when(a.getId()).thenReturn(Long.valueOf(39));
    sut.delete(a);
    txManager.commit(status);

    status = txManager.getTransaction(def);
    a = sut.get(a.getId());
    txManager.commit(status);

    assertNull(a);

A中的代码:

public void delete(A a) {

    a = getEntityManager().find(A.class, a.getId());
    getEntityManager().remove(a);

}

上面的 assertNull 检查 总是 失败有什么原因吗?无论我做什么,我都无法从系统中删除该对象 - 没有返回错误,也没有报告删除问题。 (顺便说一句,直接在 HQL 中运行查询确实会导致数据库更新......我只是无法使用使用 JPA 提供的删除方法来让它工作......)

感谢任何帮助

【问题讨论】:

  • 我们可以看到getEntityManager() 代码吗?
  • 它是使用 Spring 插入的,适用于所有其他场景。可能的原因是我的AOneToOne 关系的拥有方,但它没有定义级联选项。这可能是原因吗?
  • 我想知道的是,如果getEntityManager() 每次调用它时都返回一个新的,你是否可以用一个find() 然后再用另一个delete()。尝试调用 getEntityManager() 一次,存储对您返回的内容的引用 (EntityManager mgr = getEntityManager()),然后使用对 find()remove() 实体的相同引用。
  • 是的 - 它不会那样做。 Spring 在事务边界内创建 EntityManager 对象。如果我只是在 EntityManager 中调用remove,我会收到一个错误,我正在尝试保留一个分离的实体。我很欣赏你的提示,但不幸的是这不是问题:(

标签: java hibernate jpa jpa-2.0


【解决方案1】:

您应该看看这些 Hibernate 类/方法:

org/hibernate/engine/spi/ActionQueue.java executeActions(), unScheduleDeletion()
org/hibernate/event/internal/DefaultPersistEventListener.java onPersist()

我遇到了同样的问题 - 无法删除实体。在我的例子中,entityManager 在其“上下文”中有两个实体:一个具有子实体列表 (cascade = CascadeType.ALL) 的父级和一个要删除的子级(从列表中)。所以当我试图删除一个孩子时,父母仍然有一个指向它的链接,这导致 Hibernate 在刷新时“取消ScheduleDeletion”。

所以这里是解决方案:

  1. orphanRemoval = true添加到孩子的集合中
  2. 创建方法deleteChild(Child child) {child.setParent(null); children.remove(child);}
  3. 使用此方法删除子节点

看起来另一个解决方案是删除级联,这样父实体的合并不会导致保存其所有子实体。这里不太确定(尚未检查)。

此外,据我所知,JPA 规范描述了这种情况。

【讨论】:

  • 我遇到了同样的问题;我试图删除一个孩子,其中父母包含cascade = CascadeType.ALL 的孩子列表。我不需要此级联,因此将其删除,这导致entityManager.remove 按预期删除了我的子行。
猜你喜欢
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
相关资源
最近更新 更多