带有Hibernate的JPA EntityManager - 查找和删除不会从数据库中删除数据

时间:2013-10-03 15:34:11

标签: java hibernate jpa jpa-2.0

无法使以下代码生效...

我已经有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提供的delete方法使其工作...)< / p>

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:4)

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

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

我遇到了同样的问题 - 无法移除实体。在我的例子中,entityManager在其“上下文”中有两个实体:一个带有子实体列表( cascade = CascadeType.ALL )的父项和一个要删除的子项(来自列表)。因此,当我试图删除一个孩子时,父母仍然有一个链接,这导致Hibernate在刷新时“unScheduleDeletion”。

所以这是解决方案:

  1. orphanRemoval = true添加到子集合
  2. 创建方法deleteChild(Child child) {child.setParent(null); children.remove(child);}
  3. 使用此方法删除儿童
  4. 看起来另一种解决方案是删除级联,因此合并父实体不会导致保存其所有子级。在这里不太确定(尚未检查)。

    另外,据我记得,JPA规范描述了这种情况。