2009-07-30 8 views
2

JPAベースのJavaアプリケーションにトランザクションロールバックサポートをレトロフィットし、ロールバック(http://weblogs.java.net/blog/davidvc/archive/2007/04/jpa_and_rollbac.html)およびロールバックに接続されたJPAのキンクを処理するEcmel Ercansのアプローチを使用しています。ロールバックを使用した再利用可能なJPAトランザクションメソッドのヘルプ

EntityManager em = emf.createEntityManager(); 
EntityTransaction tx = null; 
try { 
tx = em.getTransaction(); 
tx.begin(); 
... 
... 
tx.commit(); 
} catch(Exception ex) { 
    if(tx != null && tx.isActive()) tx.rollback(); 
} finally { 
    em.close(); 
} 

私はこれに関する2つの質問があります。まず、このソリューションが登場するスレッドは2歳です。管理エンティティとロールバックに問題がありますか?

問題が解決しない場合は、解決策が少し大きくなり、実際に何が行われているのかがわかりにくいという問題があります。私はそれをジェネリックメソッドにして、私が欲しいJPAアクションを呼び出してプラグインできるようにしたいと思います。私はジェネリックメソッドがJPAトランザクション内で行うべきコマンドのメソッドを持つ匿名クラスのインスタンスを取るべきであるという考えで、しばらくそれを試してきました。

しかし、私が匿名のクラスで試した解決策は、最初の問題とほぼ同じくらい煩雑になります。これは主に、トランザクションメソッドの呼び出しの前でも後でも、通常は3つすべての匿名クラス内で、私が扱うすべてのエンティティにアクセスする必要があるためです。さらに、データを無名クラスに移動させるオーバーヘッドが増えました。これは、コードの中で「遠く」実行されると無駄に感じます。

クリーナーソリューションの提案はありますか?

答えて

3

@Transactional annotation supportと組み合わせて、Spring's JPADaoSupportクラスの使用をお勧めします。これは、@Transactionalを使ってDAOメソッドを区切る非常にきれいな方法を提供し、例外の処理方法を指定するようにします。与えられた例外がロールバックをトリガーする必要があります。基礎となる永続性APIには無関係であり、JDBC、Hibernate、JPAなどでも一貫しています。

これは非常に宣言的なので、ビジネスロジックをあいまいにしすぎてしまうという問題は大幅に軽減されます。

関連する問題