web-dev-qa-db-ja.com

@Resource UserTransactionとEntityManager.getTransaction()の違いは何ですか

誰が何が違うのか説明できますか?

@Resource
UserTransaction objUserTransaction;

そして

EntityManager.getTransaction();

また、コンテナ管理トランザクションとは何ですか?トランザクションのテーブルに3つの行を挿入する場合、セッションファサードでそれをどのように行う必要がありますか。

30
TCM

EJBはトランザクションコンポーネントです。トランザクションは、アプリケーションサーバー自体(CMT-コンテナー管理トランザクション)で管理することも、EJB内で手動で管理することもできます(BMT-Bean管理トランザクション)。

EJBは、JTA仕様を通じて分散トランザクションをサポートしています。分散トランザクションは、メソッドUserTransactionbegincommitを持つ rollback を使用して制御されます。

CMTを使用すると、アプリケーションサーバーがトランザクションを開始、コミット、およびロールバックし( transactionアノテーション に従って)、ユーザーが干渉することは許可されません。つまり、この場合はUserTransactionにアクセスしてはいけません。ただし、BMTでは手動でそれを行い、UserTransactionを使用して自分でトランザクションを制御します。

では、EntityManagerに移りましょう。 JPA実装は、アプリケーションサーバー内でもスタンドアロンでも使用できます。スタンドアロンで使用する場合は、EntityManage.getTransactionを使用して、JDBCトランザクションを自分で区別する必要があります。アプリケーションサーバー内で使用する場合、EntityManagerはJTA分散トランザクションマネージャーと透過的に連携します。

ほとんどの場合、EJBで@Requiredアノテーションを付けたCMTを使用します。つまり、UserTransactionEntityManager.getTransactionのどちらにもアクセスする必要はありません。アプリ。サーバーはトランザクションを開始してコミットしますが、例外が発生した場合はロールバックも行います。これはあなたのファサードに私がお勧めするものです。

PersistenceContextTypeEntityManager.joinTransaction を使用した分散トランザクションでのエンティティマネージャーの手動登録など、さらに微妙な点がありますが、それだけです。デフォルトとして異なる方法でテクノロジーを使用する場合)。

27
ewernli

UserTransactionは、[〜#〜] jta [〜#〜]トランザクションエンティティを指します。これを使用できるのは、アプリケーションサーバーで利用可能なJTAモジュールがある場合のみです。たとえば、Tomcat(これはデフォルトではJTAをサポートしていません)でこれを使用してアプリケーションをデプロイする場合、これに依存するコードは失敗します。 。これは、EJBおよびMDBで使用されるデフォルトのトランザクションタイプです。

EntityManager.getTransaction()は、localトランザクションエンティティを取得します。これは、リソースローカルトランザクションとも呼ばれます。

リソースローカルトランザクションはJTAトランザクションとは大きく異なります。とりわけ、リソースローカルトランザクションはリソースに固有ですが、JTAトランザクションは特定のスレッドに固有である傾向があります。

リソースのローカルトランザクションとJTAトランザクションの違いの詳細については、こちらのスタックオーバーフローの回答を参照してください。 JTAとローカルトランザクションの違いは何ですか?

8
Marco

JTAとリソースローカルトランザクションの違いを明確に示す@Marcoの回答に加えて。

コンテナー管理トランザクションは、[名前が付けられているとおり]アプリケーションではなくコンテナーによって管理されます。これは、メソッドを記述する必要があるEJB層を介して行われ、コンテナーはメソッドをトランザクションコンテキストにラップします。そのため、メソッドの一部またはその下位レベルの呼び出しが例外をスローすると、トランザクションはロールバックされます。

また、アノテーションを使用して微調整することもできます。詳細はこちら https://docs.Oracle.com/javaee/5/tutorial/doc/bncij.html

これはEJBを介してのみ行われることに注意してください。Web層にインジェクトされたエンティティマネージャー(たとえば、サーブレットまたはREST API))は、コンテナーで管理されないため、ルックアップする必要があります。 _@Resource UserTransaction_または_EntityManager.getTransaction_、begin()およびcommit()を使用したトランザクション。

Java EE 6からは、EJBをWeb層内に置くことが許可されているため、EJBをWebサービスとして公開したくない場合を除き、過度に複雑なプロジェクトレイアウトを用意する必要はありません。

0