我正在使用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。