2

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

我已经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 提供的删除方法来让它工作......)

任何帮助表示赞赏

4

1 回答 1

5

你应该看看这些 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 规范描述了这种情况。

于 2013-12-14T11:24:38.393 回答