我很难理解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));
}
BandDao
contains
和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
。
我在Arquillian
远程容器中使用Wildfly 10
运行这些测试。套件中的所有其他测试(持久化,更新,检索实体)都成功,唯一失败的是关于contains
方法的测试。
任何人都能解释我的错误吗?
答案 0 :(得分:1)
最后,问题与事务管理无关,而是与Arquillian本身无关,后者未管理测试类的@Transactional
注释。
请参阅:Testing jpa entity classes - error Transaction is required