【发布时间】:2016-07-14 19:15:10
【问题描述】:
我很难理解 EntityManager.contains 方法的工作原理,而 SO 中的其他答案对我没有帮助。
情况是这样的:
我在同一个事务中调用persist(enity) 和contains(entity)
@Test
@Transactional(value = TxType.REQUIRED)
public void testContains() {
Band band = new Band();
// populating band...
// bandDao is an `@Inject`ed in the class
bandDao.save(band);
assertThat(bandDao.contains(band), is(true));
}
BandDaocontains和save方法实现如下
public class BandDao {
@PersistenceContext
EntityManager em;
...
@Transactional(value = TxType.REQUIRED)
public void save(Band band) {
em.persist(band);
}
public boolean contains(Band band) {
return em.contains(band);
}
}
只有save 被标记为@Transactional;但是,如果我没记错的话,事务应该从调用者传播。
运行测试,它失败了,因为它期待一个true,但它收到了一个false。
我在Wildfly 10 远程容器中使用Arquillian 运行这些测试。套件中的所有其他测试(持久化、更新、检索实体)均成功,唯一失败的是关于 contains 方法的测试。
谁能解释我做错了什么?
【问题讨论】:
-
是否覆盖了
equals和hashcodeforBand? -
@AndrewTobilko
equals是,hashCode不是 -
@AndrewTobilko 我也尝试添加
hashCode实现(使用Apache的HashCodeBuilder),但没有解决。 -
是的,
hashcode不能解决问题,这只是将它们覆盖在一起的好风格 -
看起来问题与事务管理无关,而与
Arquillian本身有关。如果我从BandDao.save方法中删除@Transactional注释,它会失败,因为在实体被持久化时没有定义任何事务。这意味着,毕竟,我认为我没有在同一个事务中执行persist和contains方法。
标签: java transactions entitymanager jta java-ee-7