ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server Enterprise JavaBeansの開発
12c (12.1.2)
E48054-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

5 アノテーション付きEJBクラスのプログラミング

この章では、アノテーション付きEJB 3.1クラス・ファイルのプログラミング方法について説明します。

この章の内容は次のとおりです:

メタデータ・アノテーションとEJB Beanファイルの概要

WebLogic Server EJB 3.1プログラミング・モデルでは、Java EE 6メタデータ・アノテーション機能を使用して、アノテーション付きEJB 3.1 Beanファイルを作成し、標準Javaコンパイラでクラスをコンパイルします。生成されたクラスは、デプロイメント用のターゲット・モジュールにパッケージ化できます。実行時に、WebLogic Serverはアノテーションを解析して、必要な動作のアスペクトをBeanファイルに適用します。


ヒント:

デプロイメント時間の短縮化を図るために、WebLogicコンパイル・ツールweblogic.appc (またはこれと同等のAntタスクwlappc)を使用して、デプロイ可能なアーカイブ・ファイル(WAR、JARまたはEAR)をプリコンパイルしておくこともできます。weblogic.appcでプリコンパイルをすると、特定のヘルパー・クラスが生成され、アプリケーションが仕様に準拠しているかどうかを確認するための妥当性チェックが実行されます。


アノテーション付き3.1 Beanファイルは、EJBの中核部分です。このファイルにはEJBの動作を決定するJavaコードが含まれています。3.1 Beanファイルは、EJBのビジネス・メソッドを形作るEJBビジネス・インタフェースを実装した通常のJavaクラス・ファイルです。このBeanファイルにJDKメタデータ・アノテーションを追加することで、EJBの構造や特性を指定し、EJBを文書化し、実行時の特別なサービス(ビジネス・レベルの拡張セキュリティ、特別なビジネス・ロジックなど)を提供します。

「メタデータ・アノテーションの機能別一覧」には、Beanファイル内で指定できるアノテーションを機能別にまとめてあります。これらのアノテーションには、以下の仕様に記述されているアノテーションが含まれます。

詳細は、付録A「EJBメタデータ・アノテーション・リファレンス」を参照してください。これらのアノテーションのリファレンス情報をアルファベット順にまとめてあります。このトピックは、EJB 3.1を作成するための反復的な開発手順の一部です。詳細な開発手順については、第4章「Enterprise JavaBeansの反復的な開発」を参照してください。

一般的なEJBの設計およびアーキテクチャの詳細は、次のドキュメントを参照してください。

Beanファイルのプログラミング: 要件および2.xからの変更点

3.1 Beanクラス・ファイルをプログラミングする上での要件は、基本的には2.xでの要件と同じです。この節では、Beanクラスの基本的な必須要件について簡単に説明し、2.xと3.1の要件の相違点について説明します。

Beanクラスをプログラミングする上での必須要件と任意要件の詳細は、『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発』を参照してください。

Beanファイルの要件と2.xからの変更点

次に、3.1でBeanクラスをプログラミングする上での要件と、2.xの要件のうち3.1には適用されなくなったものをまとめます。

  • クラスにBeanタイプを指定する必要があります。通常は、以下のメタデータ・アノテーションのいずれかを使用して指定します。これらのアノテーションは、デプロイメント記述子を使用してオーバーライドすることもできます。

    • @javax.ejb.Stateless

    • @javax.ejb.Stateful

    • @javax.ejb.Singleton

    • @javax.ejb.MessageDriven


      注意:

      Oracle Kodo JPA/JDOはこのリリースで非推奨になりました。ただし、Oracle Kodoを使用している場合は、個別のドキュメントの3.0エンティティBean(@javax.ejb.Entity)のプログラミングの説明を参照してください。詳細については、Oracle KodoドキュメントのJava Persistence APIに関する項を参照してください。

      JPA 2.0をサポートするOracle TopLinkを使用することをお薦めします。Kodoでは、JPA 1.0のみをサポートします。詳細は、「Oracle WebLogic ServerでのOracle TopLinkの使用方法」を参照してください。


  • BeanがセッションBeanである場合、Beanクラスで次のいずれかを実装できます。

    • インタフェースなしのローカル・クライアント・ビュー・タイプ。個別のローカル・ビジネス・インタフェースを必要とすることなくローカル・セッションBeanへのアクセスを提供して、EJBの開発を単純化しています。

    • Beanのビジネス・インタフェースまたはBeanのビジネス・インタフェースのメソッド(存在する場合)。

  • セッションBeanにjavax.ejb.SessionBeanを実装する必要がなくなりました。つまり、ejbCreate()ejbPassivate()などのejbXXX()メソッドを実装する必要がなくなりました。

  • ステートフル・セッションBeanにjava.io.Serializableを実装する必要がなくなりました。

  • メッセージドリブンBeanにjavax.ejb.MessageDrivenBeanを実装する必要がなくなりました。

次の要件はEJB 2.xから変更されていませんが、念のため簡単にまとめておきます。

  • クラスはpublicとして定義する必要があります。finalabstractとして定義することはできません。クラスは最上位のクラスでなければなりません。

  • クラスには、パラメータを取らないpublicコンストラクタが必要です。

  • クラスにfinalize()メソッドを定義することはできません。

  • BeanがメッセージドリブンBeanである場合は、Beanでサポートするメッセージング・タイプに必要なメッセージ・リスナー・インタフェース(またはそのメッセージ・リスナー・インタフェースのメソッド)を、Beanクラスに直接的または間接的に実装する必要があります。JMSの場合であれば、メッセージ・リスナー・インタフェースはjavax.jms.MessageListenerインタフェースになります。

Beanクラス・メソッドの要件

メソッドの要件はEJB 2.xから変更されていませんが、念のため簡単にまとめておきます。

セッションBeanクラスのメソッド(ビジネス・インタフェース・メソッドを実装するメソッド)の要件は以下のとおりです。

  • メソッドには任意の名前を付けることができます。

  • ビジネス・メソッドはpublicとして宣言する必要があります。finalstaticとして宣言することはできません。

  • セッションBeanのリモート・ビジネス・インタフェース(またはリモート・インタフェース)のビジネス・メソッドに対応するメソッドの場合は、引数や戻り値の型をRMI/IIOPの有効な型にする必要があります。

  • throws句で任意のアプリケーション例外を定義できます。

メッセージドリブンBeanクラスのメソッドの要件は以下のとおりです。

  • メソッドには、メッセージ・リスナー・インタフェースのリスナー・メソッドを実装する必要があります。

  • メソッドはpublicとして宣言する必要があります。finalstaticとして宣言することはできません。

Beanファイルのプログラミング

以降の節では、アノテーション付きEJB 3.1クラス・ファイルをプログラミングする際に推奨される手順について説明します。

Beanファイルをプログラミングする際の一般的な手順

次の手順では、EJBの3.1 Beanファイルをプログラミングする場合の一般的で基本的な手順を説明します。細かな手順は、どのような動作のEJBを作成するかによって異なります。

以降の節で使用するサンプル・コードについては、第3章「Enterprise JavaBeansの単純なサンプル」を参照してください。

  1. Beanファイルで使用するEJB 3.1アノテーションおよびその他の共通アノテーションをインポートします。一般的なEJBアノテーションはjavax.ejbパッケージに含まれています。また、インターセプタ・アノテーションはjavax.interceptorパッケージ、3.1エンティティを呼び出すためのアノテーションはjavax.persistenceパッケージ、共通アノテーションはjavax.commonまたはjavax.common.securityパッケージに含まれています。例:

    import javax.ejb.Stateless;
    import javax.ejb.TransactionAttribute;
    import javax.interceptor.ExcludeDefaultInterceptors;
    
  2. EJBが実装するインタフェース(ビジネス・インタフェースまたはインタフェースなしのビュー)およびその他の標準インタフェースを指定します。インタフェースは、明示的に実装しても、アノテーションを使用して指定してもかまいません。

    「ビジネス・インタフェースとその他のインタフェースを指定する」を参照してください。

  3. 必須のアノテーションを使用して、プログラミングするBeanのタイプ(セッションまたはメッセージドリブン)を指定します。

    「Beanタイプ(ステートレス、シングルトン、ステートフル、メッセージドリブン)を指定する」を参照してください。

  4. 必要に応じて依存関係インジェクションを設定し、外部リソース(別のEJB、他のJava EE 6オブジェクトなど)を使用できるようにします。

    「変数またはセッター・メソッドにリソース依存性を注入する」を参照してください。

  5. 必要に応じてEntityManagerオブジェクトを作成し、エンティティ・アノテーションを使用してエンティティ情報を注入します。

    「3.0エンティティを呼び出す」を参照してください。

  6. 必要に応じて、ビジネス・メソッドまたはライフサイクル・コールバック・メソッドのインターセプタ・メソッドをプログラミングおよび構成します。インターセプタ・メソッドは、Beanファイル自体の中でも、別のJavaファイル内でもプログラミングできます。

    「ビジネス・メソッドまたはライフサイクル・コールバック・イベントのインターセプタを指定する」を参照してください。

  7. ビジネス・インタフェースにアプリケーション例外をスローするビジネス・メソッドを指定した場合は、例外クラスをプログラミングする必要があります。この点は、EJB 2.xでも同様です。

    EJB 3.1固有の情報については、「アプリケーション例外をプログラミングする」を参照してください。

  8. 必要に応じ、セキュリティ関連のメタデータ・アノテーションを使用して、EJBメソッドを呼び出すことができるセキュリティ・ロールを指定します。

    「EJBへのアクセスにセキュリティを設定する」を参照してください。

  9. 必要に応じて、EJBで実行するデフォルトのトランザクション構成を変更します。

    「トランザクション管理とトランザクション属性を指定する」を参照してください。

ビジネス・インタフェースとその他のインタフェースを指定する

EJB 3.x APIに記述されたセッションBeanのEJB 3.xローカルまたはリモート・クライアントは、そのビジネス・インタフェースを介してセッションBeanにアクセスします。ローカル・クライアントは、Beanクラスのすべてのパブリック・メソッドを公開するインタフェースなしのビューを介してセッションBeanにアクセスすることもできます。

ビジネス・インタフェースを指定する

EJB Beanクラスのビジネス・インタフェースを指定する方法は2つあります。

  • implements Javaキーワードを使用してビジネス・インタフェースを明示的に実装します。

  • メタデータ・アノテーション(たとえばjavax.ejb.Localjavax.ejb.Remote)を使用してビジネス・インタフェースを指定します。この場合は、Beanクラスに明示的にビジネス・インタフェースを実装する必要はありません。

通常、EJB Beanクラスに実装したインタフェースは、そのEJBのビジネス・インタフェースと見なされます。また、リモート・インタフェースであることを明示しない限り、ビジネス・インタフェースはローカル・インタフェースと見なされます。ビジネス・インタフェースをリモート・インタフェースとして明示するには、javax.ejb.Remoteアノテーションを使用するか、適切なEJBデプロイメント記述子を更新します。javax.ejb.Remoteおよびjavax.ejb.Localアノテーションは、ビジネス・インタフェース自体で指定することも、そのインタフェースを実装するBeanクラスで指定することもできます。

Beanクラスには、複数のインタフェースを実装できます。その場合(ただし、下に示すインタフェースは対象外)は、EJBのビジネス・インタフェースをjavax.ejb.Localまたはjavax.ejb.Remoteアノテーションを使用して明示的に指定する必要があります。指定する場所は、ビジネス・インタフェース自体でも、そのビジネス・インタフェースを実装するBeanクラスでも、適切なデプロイメント記述子でも構いません。

Beanクラスに複数のインタフェースが実装されているかどうかを判断する際、以下のインタフェースは対象外となります。

  • java.io.Serializable

  • java.io.Externalizable

  • javax.ejbパッケージで定義されたすべてのインタフェース

次のコードの抜粋に、Beanクラスのビジネス・インタフェースを明示的に実装して指定する方法を示します。

public class ServiceBean
  implements Service

サンプル全体を見るには、「単純なビジネス・インタフェースを使用するステートレスEJBのサンプル」を参照してください。

インタフェースなしのビューを指定する

ローカルのインタフェースなしのビューを公開するエンタープライズBeanへのクライアントのアクセスは、依存関係インジェクションまたはJNDIルックアップを介して実行されます。

  • 依存関係インジェクションを介してエンタープライズBeanのインタフェースなしのビューへの参照を取得するには、javax.ejb.EJBアノテーションを使用してエンタープライズBeanの実装クラスを指定します。

    @EJB
    ExampleBean exampleBean;
    
  • JNDIルックアップを介してエンタープライズBeanのインタフェースなしのビューへの参照を取得するには、javax.naming.InitialContextインタフェースのルックアップ・メソッドを使用します。

    ExampleBean exampleBean = (ExampleBean)
    InitialContext.lookup("java:module/ExampleBean");
    

クライアントは、新しい演算子を使用してインタフェースなしのビューを使用するエンタープライズBeanの新しいインスタンスを取得することはありません。

WebLogic Server配布キットにバンドルされているインタフェースなしのクライアント・ビューを使用するサンプルがあります。「EJB 3.1: 単純化されたインタフェースなしのプログラミングおよびWARファイルでのパッケージ化」を参照してください。

インタフェースなしのクライアント・ビューの実装の詳細は、Java EE 6チュートリアル(http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html)の「エンタープライズBean」の章のインタフェースなしのビューを使用したローカル・エンタープライズBeanへのアクセスに関する項を参照してください。

Beanタイプ(ステートレス、シングルトン、ステートフル、メッセージドリブン)を指定する

3.1 Beanクラスで必須となるメタデータ・アノテーションは、プログラミングするBeanのタイプを指定するアノテーション1つのみです。以下のアノテーションのうち、いずれか1つのみを指定する必要があります。

  • @javax.ejb.Stateless - ステートレス・セッションBeanをプログラミングすることを指定します。

  • @javax.ejb.Singleton - シングルトン・セッションBeanをプログラミングすることを指定します。

  • @javax.ejb.Stateful - ステートフル・セッションBeanをプログラミングすることを指定します。

  • @javax.ejb.MessageDriven - メッセージドリブンBeanをプログラミングすることを指定します。


    注意:

    Oracle Kodo JPA/JDOはこのリリースで非推奨になりました。ただし、Oracle Kodoを使用している場合は、個別のドキュメントの3.0エンティティBean(@javax.ejb.Entity)のプログラミングの説明を参照してください。詳細については、Oracle KodoドキュメントのJava Persistence APIに関する項を参照してください。

    JPA 2.0をサポートするOracle TopLinkを使用することをお薦めします。Kodoでは、JPA 1.0のみをサポートします。詳細は、「Oracle WebLogic ServerでのOracle TopLinkの使用方法」を参照してください。


必須ではありませんが、アノテーションの属性を指定すると、Beanタイプをより詳しく記述できます。たとえば、以下の属性はすべてのBeanタイプに設定できます。

  • name - Beanクラスの名前です。デフォルト値は、未修飾のBeanクラス名です。

  • mappedName - Beanの製品固有の名前です。

  • description - Beanについての説明です。

メッセージドリブンBeanをプログラミングする場合は、以下の属性を指定することもできます。

  • messageListenerInterface - メッセージ・リスナー・インタフェースを明示的に実装していない場合や、Beanに追加のインタフェースを実装する場合に、メッセージ・リスナー・インタフェースを指定します。

  • activationConfig - アクティブ化構成の名前と値のペアの配列を指定します。この配列は、Beanを操作環境で構成するために使用します。

次のコードの抜粋に、Beanがステートレス・セッションBeanであることを指定する方法を示します。

@Stateless
public class ServiceBean
  implements Service

サンプル全体を見るには、「単純なビジネス・インタフェースを使用するステートレスEJBのサンプル」を参照してください。

変数またはセッター・メソッドにリソース依存性を注入する

「依存関係インジェクション」では、Beanコンテキスト内のリソースや他の環境エントリを元に、EJBコンテナによってBeanの変数またはセッター・メソッドが自動的に提供(または「注入」)されます。依存関係インジェクションは、javax.ejb.EJBContextインタフェースまたはJNDI APIを使用したリソースのルックアップを、より簡単にプログラミングするための方法にすぎません。

依存関係インジェクションを指定するには、注入するリソースのタイプに応じて、以下のアノテーションのいずれかを変数またはセッター・メソッドに追加します。

  • @javax.ejb.EJB - 別のEJBへの依存性を指定します。

  • @javax.annotation.Resource - 外部リソース(JDBCデータ・ソース、JMS宛先、接続ファクトリなど)への依存性を指定します。


    注意:

    このアノテーションは、EJB固有のものではありません。さまざまなJava EEコンポーネントで使用するメタデータ・アノテーションの共通セットの一部です。


これらのアノテーションには、複数のリソースへの依存性を指定するため、それぞれに相当するグループ化アノテーション(@javax.ejb.EJBsおよび@javax.annotation.Resources)があります。

必須ではありませんが、これらの依存性アノテーションに属性を指定すると、依存するリソースを明示的に記述できます。指定する必要のある情報の量は、その使用コンテキストと、EJBコンテナがそのコンテキストからどの程度の情報を推測できるかによって異なります。これらの属性の詳細と、どのような場合に使用すべきかについては、「javax.ejb.EJB」および「javax.annotation.Resource」を参照してください。

次のコードの抜粋では、@javax.ejb.EJBアノテーションを使用して、EJBへの依存性を変数に注入する方法を示します。ここでは、Beanファイル内の関連する部分のみを示します。

package examples;
import javax.ejb.EJB;
...
@Stateful
public class AccountBean
 implements Account
{
  @EJB(beanName="ServiceBean")
  private Service service;
...
  public void sayHelloFromAccountBean() {
    service.sayHelloFromServiceBean();
  }

この例では、プライベート属性service@javax.ejb.EJBアノテーションを付けて、Bean名ServiceBeanでEJBへの参照を作成しています。サービス変数のデータ型はServiceです。これは、ServiceBean Beanクラスが実装するビジネス・インタフェースです。EJBコンテナは、AccountBean EJBを作成し、即座にServiceBeanへの参照をservice変数に注入します。これにより、この変数から、SessionBeanのすべてのビジネス・メソッドに直接アクセスできるようになります。その結果、例に示されているように、sayHelloFromAccountBeanメソッド実装でsayHelloFromServiceBeanメソッドを呼び出すことが可能になります。

3.0エンティティを呼び出す

この節では、セッションBean内から3.0エンティティを呼び出して更新する方法について説明します。


注意:

Oracle TopLink (JPA 2.0永続性プロバイダ)は、前のリリースのデフォルト・プロバイダのKodoに取ってかわり、現在デフォルトのJPAプロバイダになっています。persistence.xmlでJPAプロバイダが指定されていないアプリケーションでは、デフォルトでTopLinkが使用されます。persistence.xmlでKodo/OpenJPAを永続性プロバイダとして明示的に指定することで、アプリケーションでは引き続きKodo (PA 1.0プロバイダ)を使用できます。また、必要に応じて、デフォルトでKodoを使用するようにWebLogic Serverドメインを構成できます。詳細は、第8章「Oracle WebLogic Serverでの永続性プロバイダの構成」を参照してください。


エンティティとは、データ・ストア・レコードを表す永続オブジェクトです。通常、エンティティのインスタンスは、データベース表の単一の行を表します。エンティティを使用すると、永続ストア内の情報の問合せや更新を、Java EEコンポーネント内(セッションBeanなど)から簡単に行えます。たとえば、Personエンティティであれば、nameaddressageなどのフィールドを含み、それぞれのフィールドがデータベース内の表の列に対応します。javax.persistence.EntityManagerオブジェクトを使用してエンティティにアクセスして管理する場合、一意のIDまたはSQL問合せを使用してPersonレコードを簡単に取得でき、情報を変更した場合はその情報が基底のデータ・ストアに自動的に送信されます。

以下の節では、セッションBeanをエンティティと対話させるために必要な一般的なプログラミング・タスクについて説明します。

メタデータ・アノテーションを使用して永続性コンテキストを注入する

セッションBeanでは、以下のメタデータ・アノテーションを使用して、変数にエンティティ情報を注入できます。

  • @javax.persistence.PersistenceContext - 永続性コンテキストをjavax.persistence.EntityManagerデータ型の変数に注入します。「永続性コンテキスト」は単なるエンティティのセットで、1つの永続IDに1つの一意のエンティティ・インスタンスが対応します。persistence.xmlファイル内に、セッションBeanで使用できる永続性コンテキストを定義して名前を付けます。

  • @javax.persistence.PersistenceContexts - 複数の永続性コンテキストのセットを指定します。

  • @javax.persistence.PersistenceUnit - 永続性コンテキストをjavax.persistence.EntityManagerFactoryデータ型の変数に注入します。

  • @javax.persistence.PersistenceUnits - 複数の永続性コンテキストのセットを指定します。

@PersistenceContextアノテーションと@PersistenceUnitアノテーションは、ほとんど同じ機能(変数に永続性コンテキスト情報を注入する)を果たします。大きな違いは、情報の注入先となるインスタンスのデータ型です。セッションBean内のEntityManagerのライフサイクルを完全に制御したい場合は、@PersistenceUnitを使用してEntityManagerFactoryインスタンスに注入し、EntityManagerを手動で作成するためのコードを記述します。処理が完了したら、リソースを解放するために破棄します。EntityManagerのライフサイクルをEJBコンテナで管理したい場合は、@PersistenceContextアノテーションを使用してEntityManagerに直接注入します。

次の例では、永続性コンテキストをEntityManagerデータ型の変数emに注入する方法を示します。該当するコードは太字で示してあります。

package examples;

import javax.ejb.Stateless;

import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;

@Stateless
public class ServiceBean
  implements Service

{
  @PersistenceContext private EntityManager em;

...

EntityManager APIを使用してエンティティを検索する

EntityManagerオブジェクトをいったんインスタンス化したら、そのメソッドを使用して永続性コンテキスト内のエンティティと対話できます。この節では、エンティティのライフサイクルを特定および管理するメソッドについて説明します。EntityManagerのその他の用途(トランザクション管理、キャッシュ処理など)については、第8章「Oracle WebLogic ServerでのOracle TopLinkの使用方法」を参照してください。


注意:

この節では、理解しやすいように、エンティティがデータベース表の実際の行を表すように構成されているものとします。


EntityManager.find()メソッドを使用すると、表内の行をその主キーに基づいて検索できます。findメソッドは2つのパラメータをとります。1つは問合せするエンティティ・クラス(たとえばPerson.class)、もう1つは取得する特定の行の主キーの値です。行を取得したら、標準のgetXXXメソッドを使用して、エンティティの特定のプロパティを取得できます。次のコードの抜粋に、主キーの値が10Personを検索してその住所を取得する方法を示します。

public List<Person> findPerson () {

   Person p = em.find(Person.class, 10);
   Address a = p.getAddress();

    Query q = em.createQuery("select p from Person p where p.name = :name");
   q.setParameter("name", "Patrick");
   List<Person> l = (List<Person>) q.getResultList();

   return l;

  }

この例では、EntityManager.createQuery()メソッドを使用して、カスタムSQL問合せを含むQueryオブジェクトを作成する方法も示されています。この方法は、表の主キーだけで問合せできるEntityManager.find()メソッドとは対照的です。この例では、表内のPatrickという名前のPersonをすべて問合せし、行の結果セットをList<Person>オブジェクトに設定して呼出し側のメソッドfindPerson()に返しています。

EntityManagerを使用してエンティティを作成および更新する

新しいエンティティ・インスタンスを作成する(つまり、データベースに新しい行を追加する)には、EntityManager.persistメソッドを使用します。次にコードの抜粋を示します。

  @TransactionAttribute(REQUIRED)
  public Person createNewPerson(String name, int age) {

    Person p = new Person(name, age);
    em.persist(p); // register the new object with the database

    Address a = new Address();
    p.setAddress(a);
    em.persist(a); // depending on how things are configured, this may or 
                   // may not be required
    return p;

  }

注意:

エンティティの作成および更新は、常にトランザクション内から行う必要があります。この例で、@TransactionAttributeアノテーションがREQUIREDに設定されているのはそのためです。


前述の例では、createNewPersonメソッドに渡されたパラメータに基づいて新しいPersonを作成する方法を示しています。その後、EntityManager.persistメソッドを呼び出すことで、行がデータベース表に自動的に追加されます。

例では、新しく作成したPersonエンティティ(つまり、新しい表行)のAddressを、setAddress()エンティティ・メソッドを使用して更新する方法も示されています。Personエンティティのカスケード構成によっては、2番目のpersist()呼出しが不要な場合もあります。これは、データベースへの更新が、setAddress()メソッドによって自動的にトリガーされる場合があるためです。カスケード処理の詳細は、第8章「Oracle WebLogic ServerでのOracle TopLinkの使用方法」を参照してください。

EntityManager.find()メソッドを使用してエンティティ・インスタンスを検索し、setXXXメソッドを使用してエンティティのプロパティを変更する場合は、データベースが自動的に更新されるため、EntityManager.persist()メソッドを明示的に呼び出す必要はありません。次のコードの抜粋を参照してください。

  @TransactionAttribute(REQUIRED)
  public Person changePerson(int id, int newAge) {   
    Person p = em.find(Person.class, id);
    p.setAge(newAge);
    return p;
  }

この例では、Person.setAge()メソッドの呼出しによって、データベース表内の適切な行への更新が自動的にトリガーされています。

EntityManager.merge()メソッドを使用すると、クライアントによるエンティティの更新に基づいて、データベース表内の行をすばやく簡単に更新できます。次に例を示します。

  @TransactionAttribute(REQUIRED)
  public Person applyOfflineChanges(Person pDTO) {
    return em.merge(pDTO);
  }

この例のapplyOfflineChanges()メソッドはセッションBeanのビジネス・メソッドで、パラメータとしてセッションBeanクライアントによって作成済みのPersonを取ります。このPersonEntityManager.merge()メソッドに渡すと、EJBコンテナが自動的にデータベース表の既存の行を検索し、その行を新しいデータで更新します。更新後には、merge()メソッドによってその行のコピーが返されます。

ビジネス・メソッドまたはライフサイクル・コールバック・イベントのインターセプタを指定する

インターセプタは、ビジネス・メソッドの呼出しやライフサイクル・コールバック・イベントをインターセプトするメソッドです。インターセプタ・メソッドには、ビジネス・メソッドをインターセプトするメソッドと、ライフサイクル・コールバック・メソッドをインターセプトするメソッドの2種類があります。

インターセプタは、セッションBeanおよびメッセージドリブンBeanに指定できます。

インターセプタ・メソッドは、Beanクラス自体の中でプログラミングできますが、Beanクラスとは別にインターセプタ・クラスをプログラミングして@javax.interceptor.InterceptorsアノテーションでBeanクラスに関連付けることもできます。特定の順序でチェーンとして実行する複数のインターセプタ・メソッドを作成できます。

インターセプタ・インスタンスには状態を保持できます。インターセプタ・インスタンスのライフサイクルは、それが関連付けられているBeanインスタンスのライフサイクルと同じです。インターセプタからは、JNDI、JDBC、JMS、他のエンタープライズBean、およびEntityManagerを呼び出すことができます。インターセプタ・メソッドでは、その呼出しの対象となったBeanのJNDIネーム・スペースが共有されます。エンタープライズBeanのコンポーネントに適用する制約をプログラミングすると、それがインターセプタにも適用されます。

インターセプタは、javax.interceptorパッケージのメタデータ・アノテーションを使用して構成します。構成方法については後ほど説明します。

以下の節では、Beanクラスのインターセプタを実際にプログラミングする方法について説明します。

ビジネス・インターセプタまたはライフサイクル・インターセプタを指定する:一般的な手順

次に示す手順は、Beanクラスのインターセプタを指定してプログラミングする一般的な手順です。

インターセプタを指定しているサンプルについては「単純なステートフルEJBのサンプル」を、インターセプタ・クラスのプログラミングのサンプルについては「インターセプタ・クラスのサンプル」を参照してください。

  1. インターセプタ・メソッドを、Beanクラス内でプログラミングするか、別のインターセプタ・クラス内でプログラミングするかを決めます。

  2. インターセプタ・メソッドを別のインターセプタ・クラス内でプログラミングする場合は、次の手順に従います。

    1. 「インターセプタ・クラスをプログラミングする」の説明に従ってクラスをプログラミングします。

    2. Beanクラスでは、@javax.interceptor.Interceptorsアノテーションを使用して、インターセプタ・クラスをBeanクラスに関連付けます。インターセプタ・クラス内のメソッドには、@javax.interceptor.AroundInvokeアノテーションを付けます。これで、そのBeanクラスのビジネス・メソッド・インターセプタ・メソッドになります。同様に、ライフサイクル・コールバック・アノテーションを付けたメソッドは、そのBeanクラスのライフサイクル・コールバック・インターセプタ・メソッドになります。

    1つのBeanクラスに指定できるインターセプタ・クラスの数に制限はありません。複数のインターセプタ・クラスを指定した場合は、アノテーションに記述されている順序で実行されます。インターセプタ・クラスをクラス・レベルで指定した場合、インターセプタ・メソッドは適切なすべてのBeanクラス・メソッドに適用されます。インターセプタ・クラスをメソッド・レベルで指定した場合は、アノテーションを付けたメソッドにのみ適用されます。

  3. インターセプタ・メソッドをプログラミングしたクラス(Beanクラスまたはインターセプタ・クラス)で、「ビジネス・メソッド・インターセプタ・メソッドをプログラミングする」の説明に従ってビジネス・メソッド・インターセプタ・メソッドをプログラミングします。

  4. インターセプタ・メソッドをプログラミングしたクラス(Beanクラスまたはインターセプタ・クラス)で、「ライフサイクル・コールバック・インターセプタ・メソッドをプログラミングする」の説明に従ってライフサイクル・コールバック・インターセプタ・メソッドをプログラミングします。

  5. 必要に応じ、Beanクラス内でメソッドに@javax.interceptor.ExcludeClassInterceptorsアノテーションを付けて、クラス・レベルで定義したインターセプタを除外します。

  6. 必要に応じ、Beanクラス内でクラスまたはメソッドに@javax.interceptor.ExcludeDefaultInterceptorsアノテーションを付けて、後で定義する可能性のあるデフォルト・インターセプタを除外します。デフォルト・インターセプタは、ejb-jar.xmlデプロイメント記述子で構成します。アノテーションを使用して明示的に除外しない限り、JARファイル内のすべてのEJBに適用されます。

  7. 必要に応じ、「デフォルト・インターセプタ・メソッドを指定する」の説明に従って、EJB JARファイル全体に適用されるデフォルト・インターセプタを指定します。

インターセプタ・クラスをプログラミングする

インターセプタ・クラスは、インターセプタ・アノテーションを含むプレーンJavaクラスです。インターセプタ・アノテーションによって、どのメソッドでビジネス・メソッドやライフサイクル・コールバック・メソッドをインターセプトするかを指定します。

インターセプタ・クラスでは、依存関係インジェクションがサポートされます。依存関係インジェクションは、インターセプタ・クラス・インスタンスの作成時に、関連付けられているエンタープライズBeanのネーミング・コンテキストを使用して実行されます。

インターセプタ・クラスには、引数を取らないパブリック・コンストラクタを含める必要があります。

インターセプタ・クラスに含めるメソッドの数に制限はありませんが、インターセプタ・アノテーションを付けることのできるメソッドの数に上限があるためその制約を受けます。この点については、以降の節で説明します。

サンプルについては、「インターセプタ・クラスのサンプル」を参照してください。

ビジネス・メソッド・インターセプタ・メソッドをプログラミングする

ビジネス・メソッド・インターセプタ・メソッドを指定するには、メソッドに@AroundInvokeアノテーションを付けます。

@AroundInvokeアノテーションを付けたメソッドは、インターセプタ・クラスまたはBeanクラスごとに1つしか指定できません。1つのビジネス・メソッドに対して複数のインターセプタ・メソッドを指定するには、Beanファイル自体の中にインターセプタ・メソッドを指定した上で(この指定は省略可能)、複数のインターセプタ・クラスをBeanファイルに関連付ける必要があります。インターセプタ・メソッドが実行される順序は、関連付けられたインターセプタ・クラスを@Interceptorアノテーション内で指定する順序によって決まります。Beanファイル自体の中に指定したインターセプタ・メソッドは、インターセプタ・クラス内に定義されたメソッドの後に実行されます。

ビジネス・メソッド自体に@AroundInvokeアノテーションを付けることはできません。

@AroundInvokeメソッドのシグネチャは次のようになっている必要があります。

 Object <METHOD>(InvocationContext) throws Exception

@AroundInvokeアノテーションを付けたメソッドは、常にInvocationContext.proceed()を呼び出すようにするか、ビジネス・メソッドや後続の@AroundInvokeメソッドが呼び出されないようにする必要があります。InvocationContext APIの詳細については、「InvocationContext APIを使用してインターセプタ間で状態を保存する」を参照してください。

ビジネス・メソッド・インターセプタ・メソッドの呼出しは、対象となるビジネス・メソッドと同じトランザクションおよびセキュリティ・コンテキストの中で発生します。ビジネス・メソッド・インターセプタ・メソッドからは、ビジネス・メソッドのthrows句で許可されている実行時例外やアプリケーション例外が送出されることがあります。

サンプルについては、「インターセプタ・クラスのサンプル」を参照してください。

非同期ビジネス・メソッドをプログラミングする

セッションBeanでは、非同期メソッド、ビジネス・メソッドを実装できます。これらのメソッドでは、そのメソッドがセッションBeanインスタンスで呼び出される前にエンタープライズBeanコンテナによってクライアントに制御が戻されます。これに続き、クライアントでは、Java SEの並行処理APIを使用して、結果の取得、呼出しの取消し、例外のチェックを実行できます。通常、非同期メソッドは、メソッドの呼出し結果が即座に必要でない場合に、アプリケーションのスループット向上やレスポンス時間短縮の方法として、長時間実行される処理、プロセッサ負荷の高いタスク、バックグラウンド・タスクに対して使用します。

非同期ではない通常のビジネス・メソッドをセッションBeanクライアントが呼び出した場合、メソッドが完了するまでクライアントには制御が戻りません。一方、クライアントで非同期メソッドを呼び出した場合は、エンタープライズBeanコンテナによってクライアントにただちに制御が戻されます。そのため、クライアントではメソッドの呼出しが完了するまでの間、他のタスクを実行できます。メソッドが結果を返す場合、その結果はjava.util.concurrent.Future<V>インタフェースの実装になります。Vは結果値の型です。Future<V>インタフェースには、クライアントで使用するメソッドが定義されており、これらのメソッドを使用して、計算の完了状態のチェック、呼出し完了までの待機、最終結果の取得、呼出しの取消しを実行できます。

非同期メソッド呼出しのセマンティクスは、インタフェースなしのローカル・ビジネス・クライアント・ビューおよびリモート・クライアント・ビューのみに適用されます。EJB 2.xローカル、EJB 2.xリモート、およびWebサービス・クライアント・ビューを介して公開されるメソッドは、非同期として指定しないでください。

非同期ビジネス・メソッドの作成方法の詳細は、Java EE 6チュートリアル(http://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html)の「エンタープライズBean」の章の非同期メソッドの呼出しに関する項を参照してください。

ライフサイクル・コールバック・インターセプタ・メソッドをプログラミングする

ライフサイクル・コールバック・インターセプタ・メソッドとして指定したメソッドは、EJBコンテナからライフサイクル・イベントの通知を受信できます。ライフサイクル・イベントには、Beanインスタンスの作成、パッシブ化、破棄などがあります。

ライフサイクル・コールバック・インターセプタ・メソッドには任意の名前を付けることができます。この点は、メソッドの名前をejbCreate()ejbPassivate()などにしなければならなかったEJB 2.xプログラミング・モデルとは異なります。

メソッドをライフサイクル・コールバック・インターセプタ・メソッドとして指定するには、以下のライフサイクル・インターセプタ・アノテーションを使用します。

  • @javax.ejb.PrePassivate - EJBコンテナがステートフル・セッションBeanをパッシブ化する直前に通知を受信するメソッドを指定します。

  • @javax.ejb.PostActivate - EJBコンテナがステートフル・セッションBeanを再アクティブ化した直後に通知を受信するメソッドを指定します。

  • @javax.annotation.PostConstruct - EJBコンテナが1番目のビジネス・メソッドを呼び出す前と、依存関係インジェクションを完了した後に通知を受信するメソッドを指定します。通常、このアノテーションは、初期化を実行するメソッドに適用します。


    注意:

    このアノテーションは、javax.ejbパッケージではなく、javax.annotationパッケージに含まれています。


  • @javax.annotation.PreDestroy - EJBコンテナがBeanインスタンスを破棄する直前に通知を受信するメソッドを指定します。通常、このアノテーションは、Beanクラスが保持しているリソースを解放するメソッドに適用します。


    注意:

    このアノテーションは、javax.ejbパッケージではなく、javax.annotationパッケージに含まれています。


上に挙げたアノテーションは、メソッドがBeanクラス内にあるか別のインターセプタ・クラス内にあるかに関係なく同じ方法で使用します。1つのメソッドに複数のアノテーションを付けることもできます。

また、Beanクラス内または関連付けられたインターセプタ・クラス内に、ライフサイクル・コールバック・アノテーションのサブセットや組み合わせを指定することも可能です。ただし、1つのクラス内に、同じコールバック・アノテーションを複数回指定することはできません。1つのクラス内に複数のコールバック・アノテーションを指定した場合、そのEJBはデプロイされません。

1つのライフサイクル・コールバック・イベントに対して複数のインターセプタ・メソッドを指定するには、Beanファイル自体の中にライフサイクル・コールバック・インターセプタ・メソッドを指定した上で(この指定は省略可能)、複数のインターセプタ・クラスをBeanファイルに関連付ける必要があります。インターセプタ・メソッドが実行される順序は、関連付けられたインターセプタ・クラスを@Interceptorアノテーション内で指定する順序によって決まります。Beanファイル自体の中に指定したインターセプタ・メソッドは、インターセプタ・クラス内に定義されたメソッドの後に実行されます。

アノテーションを付けたメソッドのシグネチャは、メソッドをどこで定義したかによって異なります。

  • Beanクラスで定義したライフサイクル・コールバック・メソッドのシグネチャは次のようになります。

     void <METHOD>()
    
  • インターセプタ・クラスで定義したライフサイクル・コールバック・メソッドのシグネチャは次のようになります。

     void <METHOD>(InvocationContext)
    

InvocationContext APIの詳細については、「InvocationContext APIを使用してインターセプタ間で状態を保存する」を参照してください。

ライフサイクル・インターセプタ・クラスをプログラミングする際のその他の要件については、「javax.ejb.PostActivate」「javax.ejb.PrePassivate」「javax.annotation.PostConstruct」、および「javax.annotation.PreDestroy」を参照してください。

サンプルについては、「インターセプタ・クラスのサンプル」を参照してください。

デフォルト・インターセプタ・メソッドを指定する

デフォルト・インターセプタ・メソッドは、特定のEJB JARファイル内または展開されたディレクトリ内のすべてのコンポーネントに適用されます。したがって、必ずejb-jar.xmlデプロイメント記述子で構成する必要があり、メタデータ・アノテーションは特定のEJBにしか適用されないため使用できません。

デフォルト・インターセプタ・メソッドが設定されている場合、EJBコンテナは、EJBに対して定義されている他のすべてのインターセプタ(ビジネスおよびライフサイクルの両方)を呼び出す前に、このデフォルト・インターセプタ・メソッドを呼び出します。特定のEJBでデフォルト・インターセプタが呼び出されないようにするには、Beanファイルでクラス・レベルの@javax.interceptor.ExcludeDefaultInterceptorsアノテーションを指定します。

ejb-jar.xmlファイルでは、<assembly-descriptor><interceptor-binding>子要素を使用してデフォルト・インターセプタを指定します。具体的には、<ejb-name>子要素を*に設定してそのクラスがすべてのEJBに適用されるようにしてから、<interceptor-class>子要素をインターセプタ・クラスの名前に設定します。

次のejb-jar.xmlからの抜粋に、デフォルト・インターセプタ・クラスorg.mycompany.DefaultICを指定する方法を示します。

<?xml version="1.0" encoding="UTF-8"?>

<ejb-jar version="3.0"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
           http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">

...

   <assembly-descriptor>

...

      <interceptor-binding>
        <ejb-name>*</ejb-name>
        <interceptor-class>org.mycompany.DefaultIC</interceptor-class>
      </interceptors>

   </assembly-descriptor>

</ejb-jar>

InvocationContext APIを使用してインターセプタ間で状態を保存する

javax.interceptor.InvocationContext APIを使用すると、特定のビジネス・メソッドまたはライフサイクル・コールバックに対して実行するインターセプタ間で状態情報をやり取りできます。EJBコンテナは、同じInvocationContextインスタンスを各インターセプタ・メソッドに渡します。したがって、たとえばビジネス・メソッド・インターセプタ・メソッドを初めて実行したときの情報を保存しておき、このビジネス・メソッドに対して実行する後続のインターセプタ・メソッドにこの情報を渡すことができます。InvocationContextインスタンスは、ビジネス・メソッド呼出しやライフサイクル・コールバック呼出しの間では共有されません。

すべてのインターセプタ・メソッドは、InvocationContextパラメータを取る必要があります。これにより、InvocationContextインタフェースのメソッドを使用して、コンテキスト情報を取得したり設定したりすることが可能になります。次に、InvocationContextインタフェースを示します。

public interface InvocationContext {
    public Object getBean();
    public Method getMethod();
    public Object[] getParameters();
    public void setParameters(Object[]);
    public java.util.Map getContextData();
    public Object proceed() throws Exception;
}

getBeanメソッドは、Beanインスタンスを返します。getMethodメソッドは、呼び出されたインターセプタ・メソッドが対象とするビジネス・メソッドの名前を返します。ライフサイクル・コールバック・インターセプタ・メソッドの場合はnullを返します。

proceedメソッドは、チェーン内の次のインターセプタ・メソッドの呼出しを発生させます。チェーン内の最後の@AroundInvokeインターセプタ・メソッドから呼び出された場合は、ビジネス・メソッド自体の呼出しを発生させます。

InvocationContextを使用しているサンプルについては、「インターセプタ・クラスのサンプル」を参照してください。

アプリケーション例外をプログラミングする

ビジネス・インタフェースにアプリケーション例外を送出するメソッドを指定した場合は、その例外をBeanクラスとは別のクラスとしてプログラミングする必要があります。

@javax.ejb.ApplicationExceptionアノテーションを使用すると、例外クラスがEJBのビジネス・メソッドによって送出されるアプリケーション例外であることを指定できます。アプリケーション・エラーが発生すると、EJBコンテナからクライアントに直接例外が報告されます。

アプリケーション・エラーが発生したときに現在のトランザクションをロールバックするかどうかを指定するには、@ApplicationExceptionrollbackブール属性を使用します。デフォルトでは、エラーが発生しても現在のトランザクションはロールバックされません。

このアノテーションでは、検査済みの例外も未検査の例外も指定できます。

次に示すProcessingException.javaファイルでは、@ApplicationExceptionアノテーションを使用して、例外クラスがEJBのビジネス・メソッドによって送出されるアプリケーション例外であることを指定する方法を示します。

package examples;

import javax.ejb.ApplicationException;

/**
 * Application exception class thrown when there was a processing error
 * with a business method of the EJB.  Annotated with the
 * @ApplicationException annotation.
 */

@ApplicationException()
public class ProcessingException extends Exception {

  /**
   * Catches exceptions without a specified string
   *
   */
  public ProcessingException() {}

  /**
   * Constructs the appropriate exception with the specified string
   *
   * @param message           Exception message
   */
  public ProcessingException(String message) {super(message);}
}

EJBへのアクセスにセキュリティを設定する

デフォルトでは、EJBのパブリック・メソッドはどのユーザーでも呼び出すことができます。EJBへのアクセスを制限したい場合は、以下のセキュリティ関連アノテーションを使用して、すべてのメソッド(またはメソッドのサブセット)を呼び出すことができるロールを指定します。

  • javax.annotation.security.DeclareRoles - EJBのセキュリティ設定に使用するセキュリティ・ロールのリストを明示的に宣言します。

  • javax.annotation.security.RolesAllowed - EJBのメソッドを呼び出すことができるセキュリティ・ロールを指定します。すべてのメソッドを呼び出すことができるロールはクラス・レベルで指定し、特定のメソッドのみを呼び出すことができるロールはメソッド・レベルで指定します。

  • javax.annotation.security.DenyAll - どのロールでも呼び出すことができないメソッドを指定します。

  • javax.annotation.security.PermitAll - すべてのロールで呼び出すことができるメソッドを指定します。

  • javax.annotation.security.RunAs - EJBを実行するロールを指定します。デフォルトでは、EJBはそれを実際に呼び出したユーザーとして実行されます。

上に挙げたアノテーションは、EJB 3.1だけでなく、メタデータ・アノテーションをサポートする様々なJava EEコンポーネントで使用できます。

セキュリティ・ロールを作成し、ロールにユーザーをマッピングするには、WebLogic Server管理コンソールでセキュリティ・レルムを更新します。詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプセキュリティ・ロールの管理に関する項を参照してください。

次に、すべてのセキュリティ関連アノテーションを使用した単純なステートレス・セッションEJBのサンプルを示します。太字で示した部分については後ほど解説します。

package examples;

import javax.ejb.Stateless;

import javax.annotation.security.DeclareRoles;
import javax.annotation.security.PermitAll;
import javax.annotation.security.DenyAll;
import javax.annotation.security.RolesAllowed;
import javax.annotation.security.RunAs;

/**
 * Bean file that implements the Service business interface.
 */

@Stateless
@DeclareRoles( { "admin", "hr" } )
@RunAs ("admin")

public class ServiceBean
  implements Service
{
  @RolesAllowed ( {"admin", "hr"} )
  public void sayHelloRestricted() {
    System.out.println("Only some roles can invoke this method.");
  }

  @DenyAll
  public void sayHelloSecret() {
    System.out.println("No one can invoke this method.");
  }

  @PermitAll
  public void sayHelloPublic() {
    System.out.println("Everyone can invoke this method.");
  }
}

このサンプル・コードで注目すべき主な点は以下のとおりです。

  • セキュリティ関連メタデータ・アノテーションをインポートしています。

    import javax.annotation.security.DeclareRoles;
    import javax.annotation.security.PermitAll;
    import javax.annotation.security.DenyAll;
    import javax.annotation.security.RolesAllowed;
    import javax.annotation.security.RunAs;
    
  • クラス・レベルの@DeclareRolesアノテーションは、後ほど設定する一部またはすべてのメソッドのセキュリティで、adminおよびhrセキュリティ・ロールを使用することを明示的に指定しています。このアノテーションは必須ではありません。たとえば、@RolesReferencedアノテーションで参照されるすべてのセキュリティ・ロールは暗黙的に宣言されます。しかし、セキュリティ・ロールを明示的に宣言することでコードが理解しやすくなります。

  • クラス・レベルの@RunAsアノテーションは、EJBの特定のメソッドを実際にどのユーザーが呼び出したかに関係なく、EJBコンテナがメソッドをadminロールとして実行することを指定しています。もちろん、元のユーザーにそのメソッドの呼出しが許可されていることが前提になっています。

  • sayHelloRestrictedメソッドの@RolesAllowedアノテーションは、このメソッドの呼出しをadminまたはhrロールにマッピングされているユーザーにのみ許可することを指定しています。

  • sayHelloSecretメソッドの@DenyAllアノテーションは、このメソッドの呼出しをどのロールにマッピングされているユーザーにも許可しないことを指定しています。

  • sayHelloPublicメソッドの@PermitAllアノテーションは、このメソッドの呼出しをどのロールにマッピングされているユーザーにも許可することを指定しています。

トランザクション管理とトランザクション属性を指定する

デフォルトでは、EJBコンテナはビジネス・メソッドをトランザクション・コンテキスト内で呼び出します。また、トランザクションをコミットまたはロールバックするかどうかはEJBコンテナ自体が決定します。これを、コンテナ管理によるトランザクションの境界設定といいます。

このデフォルト動作は、Beanファイルで以下のアノテーションを使用して変更できます。

  • javax.ejb.TransactionManagement - トランザクションの境界設定を、EJBコンテナで管理するかBeanファイルで管理するかを指定します。Beanファイル管理を指定する場合は、Beanファイル内でトランザクション管理をプログラミングする必要があります。通常はJava Transaction API (JTA)を使用してプログラミングします。

  • javax.ejb.TransactionAttribute - EJBコンテナがメソッドをトランザクション内で呼び出すかどうかを指定します。

javax.ejb.TransactionAttributeアノテーションを使用しているサンプルについては、「単純なステートフルEJBのサンプル」を参照してください。

メタデータ・アノテーションの機能別一覧

以降の各節の表では、アノテーションを機能別にグループ化しています。ここに示すEJB 3.1メタデータ・アノテーションについては、完全なリファレンス情報を付録A「EJBメタデータ・アノテーション・リファレンス」にアルファベット順でまとめてあります。

Beanタイプを指定するためのアノテーション

以下の表では、Beanタイプの指定に使用するアノテーションについて簡単に説明します。

表5-1 Beanタイプを指定するためのアノテーション

アノテーション 説明
@javax.ejb.Stateless

Beanクラスがステートレス・セッションBeanであることを指定します。詳細については、「javax.ejb.Stateless」を参照してください。

@javax.ejb.Singleton

Beanクラスがシングルトン・セッションBeanであることを指定します。詳細は、「javax.ejb.Singleton」を参照してください。

@javax.ejb.Stateful

Beanクラスがステートフル・セッションBeanであることを指定します。詳細は、「javax.ejb.Startup」を参照してください。

@javax.ejb.Init

ステートフル・セッションBeanメソッドと、適合するEJB 2.1 EJBHomeまたはEJBLocalHomeクライアント・ビューのcreate<METHOD>メソッドとの対応関係を指定します。詳細については、「javax.ejb.Init」を参照してください。

@javax.ejb.Remove

ステートフル・セッションBeanのremoveメソッドを指定します。詳細については、「javax.ejb.Remove」を参照してください。

@javax.ejb.MessageDriven

BeanクラスがメッセージドリブンBeanであることを指定します。詳細については、「javax.ejb.MessageDriven」を参照してください。

@javax.ejb.ActivationConfigProperty

操作環境でメッセージドリブンBeanを構成するために使用するプロパティを指定します。詳細については、「javax.ejb.ActivationConfigProperty」を参照してください。


ローカル・インタフェースまたはリモート・インタフェースを指定するためのアノテーション

以下の表では、ローカル・インタフェースまたはリモート・インタフェースの指定に使用するアノテーションについて簡単に説明します。

表5-2 ローカル・インタフェースまたはリモート・インタフェースを指定するためのアノテーション

アノテーション 説明
@javax.ejb.Local

Beanのローカル・インタフェースを指定します。詳細については、「javax.ejb.Local」を参照してください。

@javax.ejb.Remote

Beanのリモート・インタフェースを指定します。詳細については、「javax.ejb.Remote」を参照してください。


EJB 2.xクライアント・ビューをサポートするためのアノテーション

以下の表では、EJB 2.Xクライアント・ビューのサポートに使用するアノテーションについて簡単に説明します。

表5-3 EJB 2.xクライアント・ビューをサポートするためのアノテーション

アノテーション 説明
@javax.ejb.LocalHome

Beanのローカル・ホーム・インタフェースを指定します。詳細については、「javax.ejb.LocalHome」を参照してください。

@javax.ejb.RemoteHome

Beanのリモート・ホーム・インタフェースを指定します。詳細については、「javax.ejb.RemoteHome」を参照してください。


3.0エンティティBeanを呼び出すためのアノテーション

以下の表では、3.0エンティティBeanの呼出しに使用するアノテーションについて簡単に説明します。

表5-4 3.0エンティティBeanを呼び出すためのアノテーション

アノテーション 説明
@javax.persistence.PersistenceContext

EntityManager永続性コンテキストへの依存関係を指定します。詳細は、「javax.persistence.PersistenceContext」を参照してください。

@javax.persistence.PersistenceContexts

1つまたは複数のPersistenceContextアノテーションを指定します。詳細は、「javax.persistence.PersistenceContexts」を参照してください。

@javax.persistence.PersistenceUnit

EntityManagerFactoryへの依存関係を指定します。詳細は、「javax.persistence.PersistenceUnit」を参照してください。

@javax.persistence.PersistenceUnits

1つまたは複数のPersistenceUnitアノテーションを指定します。詳細は、「javax.persistence.PersistenceUnits」を参照してください。


トランザクション関連のアノテーション

以下の表では、トランザクションに使用するアノテーションについて簡単に説明します。

表5-5 トランザクション関連のアノテーション

アノテーション 説明
@javax.ejb.TransactionManagement

トランザクションの境界設定管理の種類(コンテナ管理またはBean管理)を指定します。詳細については、「javax.ejb.TransactionManagement」を参照してください。

@javax.ejb.TransactionAttribute

ビジネス・メソッドをトランザクションのコンテキスト内で呼び出すかどうかを指定します。詳細については、「javax.ejb.TransactionManagement」を参照してください。


インターセプタを指定するためのアノテーション

以下の表では、インターセプタの指定に使用するアノテーションについて簡単に説明します。

表5-6 インターセプタを指定するためのアノテーション

アノテーション 説明
@javax.interceptor.Interceptors

Beanクラスまたはメソッドに関連付けるインターセプタ・クラスのリストを指定します。詳細については、「javax.interceptor.Interceptors」を参照してください。

@javax.interceptor.AroundInvoke

インターセプタ・メソッドを指定します。詳細については、「javax.interceptor.AroundInvoke」を参照してください。

@javax.interceptor.ExcludeClassInterceptors

アノテーションを付けたメソッドが呼び出されたときに、クラス・レベルのインターセプタを呼び出さないことを指定します。詳細は、javax.interceptor.ExcludeClassInterceptorsを参照してください。

@javax.interceptor.ExcludeDefaultInterceptors

アノテーションを付けたメソッドが呼び出されたときに、デフォルト・インターセプタを呼び出さないことを指定します。詳細は、javax.interceptor.ExcludeDefaultInterceptorsを参照してください。


ライフサイクル・コールバックを指定するためのアノテーション

以下の表では、ライフサイクル・コールバックの指定に使用するアノテーションについて簡単に説明します。

表5-7 ライフサイクル・コールバックを指定するためのアノテーション

アノテーション 説明
@javax.ejb.PostActivate

ステートフル・セッションBeanがアクティブ化された後にコールバックを受信するメソッドを指定します。詳細については、「javax.ejb.PostActivate」を参照してください。

@javax.ejb.PrePassivate

ステートフル・セッションBeanがパッシブ化される前にコールバックを受信するメソッドを指定します。詳細については、「javax.ejb.PrePassivate」を参照してください。

@javax.annotation.PostConstruct

依存関係インジェクションが完了した後に、初期化を実行するために呼び出す必要のあるメソッドを指定します。詳細については、「javax.annotation.PostConstruct」を参照してください。

@javax.annotation.PreDestroy

コンテナがインスタンスを削除しようとしていることを知らせるコールバック通知を受信するメソッドを指定します。詳細については、「javax.annotation.PreDestroy」を参照してください。


セキュリティ関連のアノテーション

以下のメタデータ・アノテーションは、EJB 3.1固有のアノテーションではなく、javax.annotation.securityパッケージに含まれる一般的なセキュリティ関連アノテーションです。

表5-8 セキュリティ関連のアノテーション

アノテーション 説明
@javax.annotation.security.DeclareRoles

Beanクラス内のセキュリティ・ロールへの参照を指定します。詳細については、「javax.annotation.security.DeclareRoles」を参照してください。

@javax.annotation.security.RolesAllowed

Beanのビジネス・メソッドを呼び出すことができるセキュリティ・ロールのリストを指定します。詳細については、「javax.annotation.security.RolesAllowed」を参照してください。

@javax.annotation.security.PermitAll

そのメソッドがすべてのセキュリティ・ロールで呼び出せることを指定します。詳細については、「javax.annotation.security.PermitAll」を参照してください。

@javax.annotation.security.DenyAll

そのメソッドがどのセキュリティ・ロールでも呼び出せないことを指定します。詳細については、「javax.annotation.security.DenyAll」を参照してください。

@javax.annotation.security.RunAs

そのメソッドをどのセキュリティ・ロールとして実行するかを指定します。詳細については、「javax.annotation.security.RunAs」を参照してください。


コンテキスト依存性アノテーション

以下の表では、コンテキスト依存性に使用するアノテーションについて簡単に説明します。

表5-9 コンテキスト依存性アノテーション

アノテーション 説明
@javax.ejb.EJB

EJBビジネス・インタフェースまたはホーム・インタフェースへの依存性を指定します。詳細については、「javax.ejb.EJB」を参照してください。

@javax.ejb.EJBs

1つまたは複数の@EJBアノテーションを指定します。詳細は、「javax.ejb.EJBs」を参照してください。

@javax.annotation.Resource

Beanの環境内の外部リソースへの依存性を指定します。詳細については、「javax.annotation.Resource」を参照してください。

@javax.annotation.Resources

1つまたは複数の@Resourceアノテーションを指定します。詳細は、「javax.annotation.Resources」を参照してください。


タイムアウトと例外のアノテーション

以下の表では、タイムアウトと例外に使用するアノテーションについて簡単に説明します。

表5-10 タイムアウトと例外のアノテーション

アノテーション 説明
@javax.ejb.Timeout

Beanクラスのタイムアウト・メソッドを指定します。詳細については、「javax.ejb.Timeout」を参照してください。

@javax.ejb.ApplicationException

例外がアプリケーション例外で、クライアントに直接報告することを指定します。詳細については、「javax.ejb.ApplicationException」を参照してください。


タイマーとスケジューリングのアノテーション

以下の表では、タイマーおよびスケジューリングに固有のアノテーションに使用するアノテーションについて簡単に説明します。

表5-11 タイマーとスケジューリングのアノテーション

アノテーション 説明
@javax.ejb.Timeout

Beanクラスのタイムアウト・メソッドを指定します。詳細については、「javax.ejb.Timeout」を参照してください。

@javax.ejb.ApplicationException

例外がアプリケーション例外で、クライアントに直接報告することを指定します。詳細については、「javax.ejb.ApplicationException」を参照してください。