独立 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.
我正在使用 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.