Java EE7は、一連の「bean」定義で構成されています。
心の混乱を取り除くために、「どの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サーバーを使用しているため、干渉はありません。
だから私の質問は本当に:
(ところで:誰かが同様の問題を述べた here が、その解決策は私の場合には当てはまらない。
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として使用します。
トランザクションのjavadoc はこう言っています:
Javax.transaction.Transactionalアノテーションは、CDI管理Bean、およびJava EE仕様でEE仕様によって管理Beanとして定義されたクラスの両方で、トランザクション境界を宣言的に制御する機能をアプリケーションに提供します。メソッドレベルのアノテーションがクラスレベルのアノテーションをオーバーライドするメソッドレベル。
だから、あなたの仮定は間違っています。 EJBは、Java EE 6までは、宣言型トランザクションをサポートする唯一の種類のコンポーネントでした。トランザクションアノテーションは、Java EE 7 -EJB、トランザクション対応の管理されたCDI Bean。