独立 JTA 1.2 和 Hibernate:JPA 不回滚?

Standalone JTA 1.2 and Hibernate: JPA not rolling back?

我正在使用 here 中描述的 "JBoss quickstart" 教程。 它演示了在独立应用程序中使用包括 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() 到 return 0。然而,它继续 return 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

看起来像是快速入门中的错误。我提出了一个问题来解决它:https://issues.jboss.org/browse/JBTM-2668.