誰が何が違うのか説明できますか?
@Resource
UserTransaction objUserTransaction;
そして
EntityManager.getTransaction();
また、コンテナ管理トランザクションとは何ですか?トランザクションのテーブルに3つの行を挿入する場合、セッションファサードでそれをどのように行う必要がありますか。
EJBはトランザクションコンポーネントです。トランザクションは、アプリケーションサーバー自体(CMT-コンテナー管理トランザクション)で管理することも、EJB内で手動で管理することもできます(BMT-Bean管理トランザクション)。
EJBは、JTA仕様を通じて分散トランザクションをサポートしています。分散トランザクションは、メソッドUserTransaction
、begin
、commit
を持つ rollback
を使用して制御されます。
CMTを使用すると、アプリケーションサーバーがトランザクションを開始、コミット、およびロールバックし( transactionアノテーション に従って)、ユーザーが干渉することは許可されません。つまり、この場合はUserTransaction
にアクセスしてはいけません。ただし、BMTでは手動でそれを行い、UserTransaction
を使用して自分でトランザクションを制御します。
では、EntityManager
に移りましょう。 JPA実装は、アプリケーションサーバー内でもスタンドアロンでも使用できます。スタンドアロンで使用する場合は、EntityManage.getTransaction
を使用して、JDBCトランザクションを自分で区別する必要があります。アプリケーションサーバー内で使用する場合、EntityManager
はJTA分散トランザクションマネージャーと透過的に連携します。
ほとんどの場合、EJBで@Required
アノテーションを付けたCMTを使用します。つまり、UserTransaction
とEntityManager.getTransaction
のどちらにもアクセスする必要はありません。アプリ。サーバーはトランザクションを開始してコミットしますが、例外が発生した場合はロールバックも行います。これはあなたのファサードに私がお勧めするものです。
( PersistenceContextType
や EntityManager.joinTransaction
を使用した分散トランザクションでのエンティティマネージャーの手動登録など、さらに微妙な点がありますが、それだけです。デフォルトとして異なる方法でテクノロジーを使用する場合)。
UserTransaction
は、[〜#〜] jta [〜#〜]トランザクションエンティティを指します。これを使用できるのは、アプリケーションサーバーで利用可能なJTAモジュールがある場合のみです。たとえば、Tomcat(これはデフォルトではJTAをサポートしていません)でこれを使用してアプリケーションをデプロイする場合、これに依存するコードは失敗します。 。これは、EJBおよびMDBで使用されるデフォルトのトランザクションタイプです。
EntityManager.getTransaction()
は、localトランザクションエンティティを取得します。これは、リソースローカルトランザクションとも呼ばれます。
リソースローカルトランザクションはJTAトランザクションとは大きく異なります。とりわけ、リソースローカルトランザクションはリソースに固有ですが、JTAトランザクションは特定のスレッドに固有である傾向があります。
リソースのローカルトランザクションとJTAトランザクションの違いの詳細については、こちらのスタックオーバーフローの回答を参照してください。 JTAとローカルトランザクションの違いは何ですか?
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サービスとして公開したくない場合を除き、過度に複雑なプロジェクトレイアウトを用意する必要はありません。