use*_*461 2 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);
Run Code Online (Sandbox Code Playgroud)
类中的代码A:
public void delete(A a) {
a = getEntityManager().find(A.class, a.getId());
getEntityManager().remove(a);
}
Run Code Online (Sandbox Code Playgroud)
上面的assertNull检查总是失败有什么原因吗?无论我做什么,我都无法从系统中删除该对象 - 没有返回错误,也没有报告删除问题。(顺便说一句,直接在 HQL 中运行查询确实会导致数据库更新......我只是无法使用 JPA 提供的删除方法让它工作......)
任何帮助表示赞赏
您应该查看这些 Hibernate 类/方法:
org/hibernate/engine/spi/ActionQueue.java executeActions(), unScheduleDeletion()
org/hibernate/event/internal/DefaultPersistEventListener.java onPersist()
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题 - 无法删除实体。就我而言,entityManager 在其“上下文”中有两个实体:一个带有子实体列表的父实体(cascade = CascadeType.ALL)和一个要删除的子实体(从列表中)。因此,当我尝试删除一个孩子时,父母仍然有一个到它的链接,这导致 Hibernate 在刷新时“unScheduleDeletion”。
所以这是解决方案:
orphanRemoval = true到儿童收藏deleteChild(Child child) {child.setParent(null); children.remove(child);}看起来另一个解决方案是删除级联,以便父实体的合并不会导致保存其所有子实体。这里不太确定(尚未检查)。
另外,据我记得,JPA 规范描述了这种情况。
| 归档时间: |
|
| 查看次数: |
6240 次 |
| 最近记录: |