web-dev-qa-db-ja.com

JEE7:EJBおよびCDI Beanはコンテナー管理トランザクションをサポートしていますか?

Java EE7は、一連の「bean」定義で構成されています。

  • マネージドBeans 1.0(JSR-316/JSR-250)
  • Java 1.0(JSR-330)の依存性注入
  • CDI 1.1(JSR-346)
  • JSFマネージドBeans 2.2(JSR-344)
  • EJB 3.2(JSR-345)

心の混乱を取り除くために、「どのBeanタイプを使用するか」の記事をいくつか調べます。 [〜#〜] ejb [〜#〜]の長所の1つは、単独でサポートしているようです宣言的なコンテナー管理トランザクション(有名なトランザクションアノテーション)。しかし、これが正しいかどうかはわかりません。誰でもこれを承認できますか?

その間、私はこれが実際に本当かどうかを確認するための簡単なデモアプリケーションを思い付きました。次のように、CDI Beanを定義しました(notEJB-クラスレベルのアノテーションはありません)。 this スニペットに基づいて:

public class CdiBean {
    @Resource
    TransactionSynchronizationRegistry tsr;

    @Transactional(Transactional.TxType.REQUIRED)
    public boolean isTransactional() {
        return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
    }
}

現在、GlassFish 4.0の結果は、このメソッドが実際にtrueを返すことです。私の問い合わせによると、これはが期待どおりに機能していない。コンテナーがCDI Beanメソッドの@Transactionalアノテーションを無視するか、例外をスローすることさえ期待していました。新しくインストールしたGlassFish 4サーバーを使用しているため、干渉はありません。

だから私の質問は本当に:

  • どのBeanタイプが実際にコンテナ管理のトランザクションをサポートしていますか?
  • 好奇心のために、上記のコードが間違っている場合、簡単なデモアプリケーションでどのようにテストできますか?

(ところで:誰かが同様の問題を述べた here が、その解決策は私の場合には当てはまらない。

19
SputNick

Java EE 7のみのEJBはトランザクション対応であり、@Transactionalアノテーションが存在しなくなるまでは。

Java EE 7およびJTA 1.2であるため、@Transactionalアノテーションを使用してCDIでトランザクションインターセプターを使用できます。

使用するのに最適なタイプのBeanに関する質問に答えるために、答えはデフォルトでCDIです。

CDI BeanはEJBよりも軽く、多くの機能(EJBを含む)をサポートしており、デフォルトで(アプリにbeans.xmlファイルを追加すると)アクティブになります。 Java EE 6 @Inject@EJBに置き換わります。リモートのEJB(CDIに存在しない機能)を使用する場合でも、@EJBを1回使用することをお勧めします。リモートEJBとCDIプロデューサーを注入してCDI Beanとして公開する

public class Resources {

    @EJB
    @Produces
    MyRemoteEJB ejb;

}

Java EEリソースについても同様です。

public class Resources2 {

    @PersistenceContext
    @Produces
    EntityManager em;

}

これらのプロデューサーは後で使用されます

public class MyBean {

    @Inject
    MyRemoteEJB bean;

    @Inject
    EntityManager em;

}

EJBは、JMSや非同期処理など、それらに含まれる特定のサービスに対して引き続き意味をなしますが、CDI Beanとして使用します。

31

トランザクションのjavadoc はこう言っています:

Javax.transaction.Transactionalアノテーションは、CDI管理Bean、およびJava EE仕様でEE仕様によって管理Beanとして定義されたクラスの両方で、トランザクション境界を宣言的に制御する機能をアプリケーションに提供します。メソッドレベルのアノテーションがクラスレベルのアノテーションをオーバーライドするメソッドレベル。

だから、あなたの仮定は間違っています。 EJBは、Java EE 6までは、宣言型トランザクションをサポートする唯一の種類のコンポーネントでした。トランザクションアノテーションは、Java EE 7 -EJB、トランザクション対応の管理されたCDI Bean。

7
JB Nizet