Java EntityManager.contains-在同一事务中返回false
我正在努力理解Java EntityManager.contains-在同一事务中返回false,java,transactions,entitymanager,jta,java-ee-7,Java,Transactions,Entitymanager,Jta,Java Ee 7,我正在努力理解EntityManager.contains方法是如何工作的,所以中的其他答案对我没有帮助 情况就是这样: 我在同一事务中调用persist(enity)和contains(entity) @Test @Transactional(value = TxType.REQUIRED) public void testContains() { Band band = new Band(); // populating band... // bandDao is
EntityManager.contains
方法是如何工作的,所以中的其他答案对我没有帮助
情况就是这样:
我在同一事务中调用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));
}
bandao
包含
和保存
方法实现如下
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);
}
}
只有保存
标记为@Transactional
;但是,如果我没有弄错,那么应该从调用方传播事务
运行测试时,它会失败,因为它期望为true
,但它会收到为false
我使用Arquillian
在Wildfly 10
远程容器中运行这些测试。套件中的所有其他测试(持久化、更新、检索实体)都成功,唯一失败的是关于contains
方法的测试
有人能解释我做错了什么吗?最后,问题与事务管理无关,而是与Arquillian本身有关,它没有管理测试类上的
@Transactional
注释
请参阅:是否已覆盖
频带
的equals
和hashcode
?@andreTobilkoequals
is,hashcode
isnot@AndrewTobilko我还尝试添加了hashCode
实现(使用Apache
的HashCodeBuilder
),但没有解决问题。是的,hashcode
并不能解决问题,这只是一种很好的覆盖方式。看起来问题与事务管理无关,而是与Arquillian
本身有关。如果我从BandDao.save
方法中删除@Transactional
注释,它将失败,因为在实体被持久化时没有定义任何事务。这意味着,毕竟,我没有在同一个事务中执行persist
,而包含方法。