2011-12-11 4 views
25

私は最近、Google App EngineでJPAの作業を開始しました。いくつかの例を読んで、私はオブジェクトが永続化される方法にいくつかのバリエーションがあることに気付きました。あるケースでは、私はこのようなものを見てきました:JPA - オブジェクトを永続化するときにgetTransaction()を使用する場合

entityManager.getTransaction().begin(); 
entityManager.persist(object); 
entityManager.getTransaction().commit(); 

他の例では、私はgetTransactionの使用は表示されません()。私は単にentityManager.persist(オブジェクト)を参照してください。 getTransaction()の使用はいつ適切ですか?

答えて

14

コンテナ管理のEntityManagerを使用している場合は、JTAトランザクションを使用しています。したがって、entityManager.getTransaction()を使用してフェッチされたEntityManagerのトランザクションに干渉する必要はありません(より正確には - できません)。 JTAはトランザクションを開始し、コミットします。

アプリケーション管理EntityManagerを使用していて、JTAトランザクションに参加したくない場合は、自分で管理する必要があります(リソースローカルエンティティマネージャと呼ばれます)。

最も一般的には、EntityManager.getTransaction()で動作するアプリケーションEntityManagerがJava SE環境で使用されます。

編集:興味があるかもしれませんsec30 7.5トランザクションの制御JPA 2.0 specificationから。

+2

GAEは、JTAをサポートしていません。 –

+0

GAEと一緒に働いたことはありません - これはJPAトランザクション中心の質問だと思いました。明確化のためにありがとう。 –

+1

データベースからエンティティを取得してもトランザクションを取得する必要がありますか... entitymanager.findメソッドを使用する...ちょっと好奇心が強い...なぜなら、私は単一の例を見ることができないからです... entitymanger.findの前にtransaction.begin()方法... :) :) – goodyzain

0

アプリケーションでトランザクションを明示的に処理するときは、getTransaction()を使用します。一方、コンテナにトランザクションを処理させる場合、明示的にトランザクションを開始/終了する必要はありません。本質的には、Container Managed Transactions(CMT)とBean Managed Transactions(BMT)の違いを扱っています。

一般的に、トランザクション処理を詳細に制御する必要がある場合、または満たされない追加の技術要件(2フェーズコミット、分散トランザクション、XAトランザクションなど)がある場合は、BMTを使用します。 CMTを使用します。また、アプリケーションがアプリケーションサーバーの外部に配置され、Java SEに依存している場合は、BMTを使用します。

5

GAEには、Java EE/JTAがないため、Bean管理トランザクション(BMT)やコンテナ管理トランザクション(CMT)などの用語を無視します。

あなたの仕事は、複数のオブジェクトを同時にデータストアに移動したい場合や、すべてが失敗する場合(これはgetTransaction()が使用される場所)、またはトランザクション以外の場合(すべてがデータストアに移動するpersist()/ merge()/ remove())を呼び出すことができます。

+1

GAEにJava EEの一部がありますが、完全なプロファイルではありません。たとえばJPAはJava EE APIですが、動作は「少し異なります」。 –

3

Google App Engineはトランザクション管理(https://developers.google.com/appengine/docs/java/datastore/transactions)を持っていますが、JPAトランザクションインターフェイスはGAEの基本機能(エンティティグループ)の一部を認識していません。

トランザクションで実行する操作と実行しない操作は、アプリケーションによって異なります。 アトミックに実行する必要があるトランザクション操作を配置する必要があります。

JPAによって多くのクエリがトリガされる可能性があり、データの状態が一貫しないため、カスケード処理およびリレーションシップ処理をトランザクションで実行することをお勧めします。JPA2でトランザクションを使用しての

例:

import javax.persistence.EntityTransaction; 


EntityTransaction txn = em.getTransaction(); 
txn.begin(); 
try { 
    //do something with your database 
    txn.commit(); 
} 
finally { 
    if (txn.isActive()) 
     txn.rollback(); 
} 
関連する問題