【问题标题】:EntityManager.contains - returns false in same transactionEntityManager.contains - 在同一事务中返回 false
【发布时间】: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));
}

BandDaocontainssave方法实现如下

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

谁能解释我做错了什么?

【问题讨论】:

  • 是否覆盖了 equalshashcode for Band
  • @AndrewTobilko equals 是,hashCode 不是
  • @AndrewTobilko 我也尝试添加hashCode 实现(使用ApacheHashCodeBuilder),但没有解决。
  • 是的,hashcode 不能解决问题,这只是将它们覆盖在一起的好风格
  • 看起来问题与事务管理无关,而与Arquillian 本身有关。如果我从BandDao.save 方法中删除@Transactional 注释,它会失败,因为在实体被持久化时没有定义任何事务。这意味着,毕竟,我认为我没有在同一个事务中执行persistcontains 方法。

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


【解决方案1】:

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

见:Testing jpa entity classes - error Transaction is required

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 2013-03-10
    • 2018-08-13
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多