2016-04-25 63 views
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

+0

是否有任何具體的理由沖刷後堅持和合並? – Jaumzera

+0

請試試這個:將testEntityRepository.save調用到TestEntityRepository中的一個方法,並從testJpa調用它。 – Jaumzera

+0

@Jaumzera感謝您的建議。按照你的建議試用,但效果相同。我猜JPA交易在某種程度上與JTA交易沒有正確的關聯。奇怪的是,如果我用'@Transactional(TxType.MANDATORY)'替換'@ Transactional',並在測試用例中省略'entityManager.begin()',那麼我會得到一個異常說明需要一個事務,這是正確的。 – geert3

回答