31

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

@Resource
UserTransaction objUserTransaction;

EntityManager.getTransaction();

また、コンテナ管理トランザクションとは何ですか? トランザクションでテーブルに3行を挿入したい場合、セッションファサードでどのように行うべきですか。

4

3 に答える 3

30

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

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

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

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

ほとんどの場合、CMT を@RequiredEJB のアノテーションとともに使用します。UserTransactionこれは、どちらにもアクセスする必要がないことを意味しますEntityManager.getTransaction。アプリ。サーバーはトランザクションを開始してコミットしますが、例外が発生した場合はロールバックも行います。これは私があなたのファサードに推奨するものです。

PersistenceContextType( や を使用した分散トランザクションでのエンティティ マネージャーの手動登録など、さらに微妙な点がありますが、それEntityManager.joinTransactionは、既定とは異なる方法でテクノロジを使用する場合に限られます)。

于 2010-03-25T17:04:07.800 に答える
8

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

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

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

リソースのローカル トランザクションと JTA トランザクションの違いの詳細については、こちらの stackoverflow の回答を参照してください: What is the difference between a JTA and a local transaction?

于 2013-10-25T15:19:31.383 に答える
0

JTAとリソースのローカルトランザクションの違いをうまく伝える@Marcoの回答に加えて。

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

注釈を使用して微調整することもできます。詳細については、https://docs.oracle.com/javaee/5/tutorial/doc/bncij.htmlを参照してください。

@Resource UserTransactionこれは EJB を介してのみ行われ、Web 層に挿入されたエンティティ マネージャー (サーブレットやREST API など) はコンテナーによって管理されないことに注意しEntityManager.getTransactionbegin()くださいcommit()

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

于 2014-11-22T12:52:11.430 に答える