无法使以下代码生效...
我已经有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>
任何帮助表示赞赏
答案 0 :(得分:4)
你应该看看这些Hibernate类/方法:
org/hibernate/engine/spi/ActionQueue.java executeActions(), unScheduleDeletion()
org/hibernate/event/internal/DefaultPersistEventListener.java onPersist()
我遇到了同样的问题 - 无法移除实体。在我的例子中,entityManager在其“上下文”中有两个实体:一个带有子实体列表( cascade = CascadeType.ALL )的父项和一个要删除的子项(来自列表)。因此,当我试图删除一个孩子时,父母仍然有一个链接,这导致Hibernate在刷新时“unScheduleDeletion”。
所以这是解决方案:
orphanRemoval = true
添加到子集合deleteChild(Child child) {child.setParent(null); children.remove(child);}
看起来另一种解决方案是删除级联,因此合并父实体不会导致保存其所有子级。在这里不太确定(尚未检查)。
另外,据我记得,JPA规范描述了这种情况。