2010-12-27 8 views
0

私はいくつかのアプリケーションでJpaTemplateを使用していくつかのボイラープレートコードを削除する可能性を調べ始めました。javaでJpaTemplateを使用してトランザクションを処理しますか?

私は今、この権利のようなものを持っている:

public class SomeDaoClass { 

    public SomeDaoClass(boolean handleTransactionsLocally) { 
      _handleTransactionsLocally = handleTransactionsLocally; 
    } 

    private void persist(final Object object) throws MyCustomException { 
     try { 
      if (_handleTransactionsLocally) { 
       EntityTransaction transaction = getEntityManager().getTransaction(); 

       transaction.begin(); 
       getEntityManager().persist(object); 
       transaction.commit(); 
      } 
      else { 
       getEntityManager().persist(object); 
       getEntityManager().flush(); 
      } 
     } 
     catch (Exception exception) { 
      throw new MyCustomException(exception); 
     } 
    } 
} 

ユニットテストから実行したとき、私はgetEntityManager()をオーバーライドし、コンストラクタへの真の提供。これをサーバーにデプロイすると、注入されたエンティティマネージャがコンテナから返されます。

しかし、私が代わりにこれのような何かを行うことができるはずのように思える:

 _jpaTemplate = new JpaTemplate(getEntityManager()); 
     _jpaTemplate.persist(object); 

にはどうすればjpaTemplateがトランザクションを処理する方法をJavaコードで指定することができますか?私は@Transactionalとメソッドを注釈してみましたが、これは動作していないようです。 _jpaTemplateにプロパティを設定する必要はありますか?これも可能ですか?

TIA

答えて

1

別に@Transactionalを追加することから、あなたはapplicationContext.xml<tx:annotation-driven />を指定する必要があり、また、Beanは(あなたのケースでは)追記としてタイプorg.springframework.orm.jpa.JpaTransactionManager

であること、transactionManagerと呼ばれている - それはDAOをトランザクションにするのは良い考えではありません。代わりにサービス層をトランザクションにする方がよいでしょう。

+0

しかし、applicationContext.xmlなしでこれを行う方法はありますか?それが私がここで走っているものです。 – javamonkey79

+0

にはapplicationContext.xmlがあります。また、宣言的なトランザクションを追加することもできません。 – Bozho

+0

私はapplicationContext.xmlを持っていません - 私はJdbcTemplateクラスと同じ方法でJpaTemplateを使用しようとしています。 – javamonkey79

1

Bozhoの回答に加えて、宣言的なトランザクションを得るために実際にはJpaTemplateを使用する必要はありません。

JPAをSpringで宣言型トランザクションで使用する典型的な方法は、@PersistenceContext注釈付きフィールドに共有されたEntityManagerを使用することです。 13.5.2 Implementing DAOs based on plain JPAを参照してください。

+0

うーん、ごめんなさい - 私が求めていることとどのように合っているのか分かりません。 – javamonkey79

関連する問題