2016-04-25 10 views
0

hereと記載されている「JBossクイックスタート」チュートリアルを使用しています。 JPAを含む分散トランザクションをスタンドアロンアプリケーションで使用する方法を示します。スタンドアロンJTA 1.2および休止状態:JPAはロールバックされませんか?

私はコードをダウンロードしました。正常に動作し、すべてのテストケースが緑色です。

それは、次のテストケースが含まれますと

@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()); 
    } 

:私はこのように、トランザクションを開始し、アサートする前にそれをロールバックすることによって、これをより面白くしたかった

@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()); 
    } 

rollback()私はfindAll().size()0を返すと期待します。しかし、それは3を返し続けます。私は行方不明のものがありますか? JPAの状態をロールバックする機能はチュートリアルの主な目的の1つと思われますか?

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内のメソッドにtestEntityRepository.save呼び出しを移動し、testJpaから呼び出します。 – Jaumzera

+0

@Jaumzeraあなたの提案に感謝します。あなたが示唆したように試みたが、同じ効果。私は、JPAトランザクションが何らかの形でJTAトランザクションに正しくリンクされていないと思います。 @Transactional(TxType.MANDATORY)で '@Transactional'を置き換え、テストケースにentityManager.begin()を残しておけば、トランザクションが必要であるという例外が発生します。 – geert3

答えて