EntityManager.contains - 在同一事务中返回false

时间:2016-03-27 11:45:57

标签: java transactions entitymanager jta java-ee-7

我很难理解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 containssave方法实现如下

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方法的测试。

任何人都能解释我的错误吗?

1 个答案:

答案 0 :(得分:1)

最后,问题与事务管理无关,而是与Arquillian本身无关,后者未管理测试类的@Transactional注释。

请参阅:Testing jpa entity classes - error Transaction is required