0
我正在使用描述爲here的「JBoss快速入門」教程。 它演示了在獨立應用程序中使用包括JPA的分佈式事務。獨立JTA 1.2和Hibernate: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。
是否有任何具體的理由沖刷後堅持和合並? – Jaumzera
請試試這個:將testEntityRepository.save調用到TestEntityRepository中的一個方法,並從testJpa調用它。 – Jaumzera
@Jaumzera感謝您的建議。按照你的建議試用,但效果相同。我猜JPA交易在某種程度上與JTA交易沒有正確的關聯。奇怪的是,如果我用'@Transactional(TxType.MANDATORY)'替換'@ Transactional',並在測試用例中省略'entityManager.begin()',那麼我會得到一個異常說明需要一個事務,這是正確的。 – geert3