2011-06-28 6 views
0

私はejb3でhibernateを使用してJPA 2について勉強しました。 そこで、機能をテストするためのサンプルクラスを作成しました。私はBMT取引を使用しようとしましたが、取引の問題に直面しました。 以下のサンプルコードから、dosomething()に何か問題が生じた場合、例外がスローされ、UserTransactionがロールバックされます。 しかし、例外がスローされても、編集したエンティティがDBに更新されていることがわかりました。私は設定で何かを見逃している場合誰も私を指摘することはできますか?トランザクションはロールバックされましたが、Hibernate JPA 2.0およびEJB3 with BMTを使用してコミットされました

@Stateless(mappedName = "MyManagementBean") 
    @Local 
    @TransactionManagement(TransactionManagementType.BEAN) 


    public class MyManagement implements MyManagementLocal,MyManagementRemote { 

     @PersistenceUnit(unitName="MyEjb") EntityManagerFactory emf; 
     @Resource UserTransaction utx; 
     @Resource SessionContext ctx; 

     /** 
     * Default constructor. 
     */ 
     public MyManagement() { 
      // TODO Auto-generated constructor stub 
     } 

     public void dosomething(String id) throws Exception 
     { 

      try { 
       utx.begin();  
       em = emf.createEntityManager(); 

       Myline line = em.find(Myline.class, id); 

       line.setStatus("R"); 

       em.flush(); 
       utx.commit(); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
       if (utx != null) utx.rollback(); 
       throw e; // or display error message 
      } 
      finally { 
       em.close(); 
      }  
     } 

答えて

0

例外の種類は何ですか。プログラムは、これまでにも例外はありません

e.printStackTrace(); 
if (utx != null) { 
    utx.rollback(); 
    system.error.println("Rolled Back"); 
}     
throw e; // or display error message 
+0

を試してみてください

utx.rollback(); 

に電話を打つん。コード全体がうまくいくようです。 JPAクエリーを実行する前を除いて、これは自動的にフラッシュし、以前の変更をDBにコミットします。 – Quincy

+0

申し訳ありませんが、私は "編集されたエンティティは例外がスローされてもDBに更新されていますが、設定に何か不足していると私を指摘できますか?" – Luke

+0

http://stackoverflow.com/questions/6516973/hibernate-entity-manager-auto-flush-before-query-and-commit-changes-to-db-in-tran/6537016#6537016 - 詳細と関連する質問 – Luke

関連する問題