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