独立的JTA 1.2和Hibernate:JPA没有回滚?

时间:2016-04-25 14:26:39

标签: jpa java-ee entitymanager jta weld

我正在使用here所述的“JBoss快速入门”教程。 它演示了在独立应用程序中使用包括JPA在内的分布式事务。

我已经下载了代码,运行正常,所有测试用例都是绿色的。

它包含以下测试用例:

  @Test
  public void testJpa() throws Exception {
    System.out.println(testEntityRepository.save(new TestEntity("test1")));
    System.out.println(testEntityRepository.save(new TestEntity("test2")));
    System.out.println(testEntityRepository.save(new TestEntity("test3")));
    org.junit.Assert.assertEquals(3, testEntityRepository.findAll().size());
  }

我希望通过启动事务并在断言之前将其回滚来使这更有趣,如下所示:

  @Test
  public void testJpa() throws Exception {
    transactionManager.begin();
    System.out.println(testEntityRepository.save(new TestEntity("test1")));
    System.out.println(testEntityRepository.save(new TestEntity("test2")));
    System.out.println(testEntityRepository.save(new TestEntity("test3")));
    transactionManager.rollback();
    org.junit.Assert.assertEquals(0, testEntityRepository.findAll().size());
  }

使用rollback()我希望findAll().size()返回0。但是它会继续返回3。有什么我想念的吗?回滚JPA状态的能力似乎是本教程的主要目标之一吗?

TestEntityRepository的原始代码:

public class TestEntityRepository {

    @Inject
    EntityManager entityManager;

    @Transactional
    public List<TestEntity> findAll() {
        assert entityManager != null;
        return (List<TestEntity>) this.entityManager.createQuery("select te from TestEntity te").getResultList();
    }

    @Transactional
    public Long save(TestEntity testEntity) {
        assert entityManager != null;
        if (testEntity.isTransient()) {
            entityManager.persist(testEntity);
            entityManager.flush();
        } else {
            entityManager.merge(testEntity);
            entityManager.flush();
        }
        return testEntity.getId();
    }
}

可以找到其他代码here

1 个答案:

答案 0 :(得分:1)

看起来像快速入门中的错误。我提出了修复问题:https://issues.jboss.org/browse/JBTM-2668