プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle JDeveloperによるアプリケーションの開発
12c (12.1.3)
E57556-02
  目次へ移動
目次

前
 
 

28 EJBおよびJPAコンポーネントを使用した開発

この章では、JDeveloperツールを使用して、Enterprise JavaBeans (EJB) 3xおよびJava永続性API (JPA)コンポーネントによるJava EEエンタープライズ・アプリケーションのビジネス層をビルドする方法について説明します。

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

28.1 EJBおよびJPAコンポーネントを使用した開発について

JDeveloperには、EJBプロジェクト、エンティティ、永続性ユニット、セッションBeanおよびメッセージドリブンBeanを作成するための段階的ウィザードが用意されています。オンライン・データベース定義またはオフライン・データベース定義およびアプリケーション・サーバーのデータソース接続からエンティティを構築できます。また、JPAおよびTopLinkテクノロジとシームレスに統合できるため、完全な永続性パッケージを実現することもできます。

28.2 EJBバージョンおよび機能のサポート

JDeveloperは、EJB 3xおよびバージョン1.0から2.1をサポートしています。ただし、EJBウィザードはバージョン2.x以前のEJBの作成をサポートしていませんが、かわりに、旧EJBをバージョン3.1にインポートするように要求されます。現在のJDeveloper文書(ユーザー・ガイドのこの章および埋め込まれているオンライン・ヘルプを含む)は、EJB 3.1開発タスクに焦点を当てています。


注意:

EJB 2.1以前の使用方法の詳細は、JDeveloper10gの旧バージョンのドキュメントを参照してください。EJBアプリケーション開発インタフェースはバージョンごとに異なる可能性があり、一部の履歴ヘルプの内容は現在のバージョンでは古い場合があります。

EJB 3.1の仕様およびドキュメントについては、http://docs.oracle.com/javaee/で「Java Platform, Enterprise Edition (Java EE) Technical Documentation」のページを参照してください。


注意:

EJB 3xを使用している場合、一部のデプロイ・ファイルのかわりに注釈を使用できる場合があります。デプロイメント・ディスクリプタを含めて、注釈をオーバーライドするか、または注釈でサポートされていないオプションを指定します。

サポートされる新規EJB 3.1機能

EJB 3.1仕様には、簡易なプログラミングおよびパッケージング・モデルの変更が用意されています。

  • シングルトン・セッションBean: シングルトン・セッションBeanは、セッションBeanが特定のJava Virtual Machine (JVM)でアプリケーションごとに1回インスタンス化され、それはアプリケーションのライフサイクルにわたって存在することを保証する正式なプログラミング構成メンバーとして機能します。シングルトンを使用すると、エンタープライズBeanコンポーネントの複数のインスタンス間で、またはアプリケーション内の複数のエンタープライズBeanコンポーネント間で容易に状態を共有することができます。

  • No Interfaceクライアント・ビューの簡素化: No-Interfaceローカル・クライアント・ビュー・タイプでは、ローカル・ビジネス・インタフェースをオプションにすることにより、EJBデプロイメントが簡素化されます。ローカル・ビジネス・インタフェースを持たないBeanは、ビジネス・インタフェースを別途作成しなくても同じエンタープライズBean機能を提供できるNo-Interfaceビューを公開します。

  • EJBをパッケージ化してWARファイルに直接デプロイ: EJB 3.1には、WebコンポーネントとEJBコンポーネントを保存するためのアーカイブを作成しなくてもEJBコンポーネントをWebアプリケーション・アーカイブ(WAR)ファイル内に直接配置し、それらをエンタープライズ・アプリケーション・アーカイブ(EAR)ファイルに一括する機能が用意されています。

  • 移植可能なグローバルJNDI名: EJB 3.1の移植可能なグローバルJNDIネーミング・オプションによって、共通する、一般的によく知られたネームスペースが多数用意されています。これらのネームスペースでは、EJBコンポーネントを登録したり、パターンjava:global[/<app-name>]/<module-name>/<bean-name>を使用して参照したりできます。これによって、EJBコンポーネントのJNDIでの登録方法と登録場所および、アプリケーションによる参照方法と使用方法が標準化されます。

  • 非同期セッションBeanの起動: EJB 3.1のセッションBeanは、非同期のクライアント起動セマンティクスを使用してメソッドを公開できます。EJBクラスまたは特定のメソッドで注釈@Asynchronousを使用して、メソッドが起動したときに制御をクライアントに即時戻すようにEJBコンテナに指示します。このメソッドによって、クライアントがメソッド起動状況を確認したり、非同期に生成される結果値を取得したりできる将来のオブジェクトが返される場合もあります。

  • EJBタイマー拡張: EJB 3.1のタイマー・サービスはカレンダ・ベースのEJBタイマー式をサポートしています。スケジューリング機能は、CRONスタイルのスケジュール定義の形式をとります。この定義は、定義されたスケジュールに従ってメソッドを自動的に起動するために、EJBメソッドに配置できます。また、EJB 3.1では、Beanクラスまたはデプロイメント・ディスクリプタ内のメタデータに基づくタイマーの自動作成もサポートしており、Bean開発者は、Bean起動に依存しなくても、タイマー・サービスのタイマー作成方法の1つをプログラムによって起動するようにタイマーをスケジュールすることができます。自動作成されたタイマーは、アプリケーション・デプロイメントの結果としてコンテナにより作成されます。

サポートされているEJB 3.0の新機能と変更された機能

EJB 3.0と以前のバージョンとの主な違いは、次のとおりです。

  • EJBの簡素化 - EJB 3.0では、ホーム・インタフェースおよびコンポーネント・インタフェースが不要であり、javax.ejb.EnterpriseBeanインタフェースを実装するためのBeanクラスの要件もありません。EJB Beanクラスは完全なJavaクラス(POJO)となり、インタフェースは単純なビジネス・インタフェースとなります。このBeanクラスでは、ビジネス・インタフェースが実装されます。

  • デプロイメント・ディスクリプタに代わる注釈の使用 - デプロイメント・ディスクリプタのかわりにメタデータ注釈が使用されます。注釈により、Beanタイプ、トランザクションまたはセキュリティ設定などの様々な属性、環境のO-Rマッピングとインジェクションまたはリソース参照を指定します。デプロイメント・ディスクリプタ設定により、メタデータ注釈をオーバーライドします。

  • 依存性インジェクション: EJB環境の参照と使用およびリソース参照のためのAPIが簡素化され、かわりに依存性インジェクションが使用されています。依存性インジェクションにはメタデータ注釈が使用されます。

  • ライフサイクル・メソッドおよびコールバック・リスナー・クラスの拡張 - EJBの前のバージョンとは異なり、不要なコールバック・メソッドをすべて実装する必要はありません。かわりに、任意のメソッドをコールバック・メソッドとして指定し、ライフサイクル・イベントに関する通知を受信します。同じBeanクラスで定義されているコールバック・メソッドのかわりに、コールバック・リスナー・クラスが使用されます。

  • インターセプタ - インターセプタは、ビジネス・メソッドのコールを捕捉するメソッドです。インターセプタ・メソッドは、ステートレス・セッションBean、ステートフル・セッションBeanまたはメッセージドリブンBeanで定義されます。Beanクラスでインターセプタ・メソッドを定義するかわりに、インターセプタ・クラスが使用されます。

  • EJBのJNDI参照の簡素化 - EJBの参照が簡素化されており、EJBでcreate()メソッドを呼び出すことでクライアントはBeanインスタンスを作成する必要がなくなり、EJBでメソッドを直接呼び出すことができるようになりました。

セッションBean

  • Beanの簡素化 - セッションBeanは完全なJavaクラスであり、javax.ejb.SessionBeanインタフェースは実装しません。ホーム・インタフェースはオプションです。セッションBeanには、リモートまたはローカル(あるいはその両方)のインタフェースがあり、これらのインタフェースはEJBObjectまたはEJBLocalObjectを拡張する必要はありません。

  • メタデータ注釈 - メタデータ注釈は、BeanまたはインタフェースおよびセッションBeanのランタイム・プロパティを指定するために使用されます。たとえば、セッションBeanは、Beanタイプを指定するために@Statelessまたは@Statefulでマークされます。

  • ライフサイクル・メソッドおよびコールバック・リスナー - コールバック・リスナーは、ステートフル・セッションBeanとステートレス・セッションBeanの両方でサポートされます。これらのコールバック・メソッドは、注釈またはデプロイメント・ディスクリプタを使用して指定されます。

  • 依存性インジェクション - 依存性インジェクションは、ステートフル・セッションBeanまたはステートレス・セッションBeanから使用されます。開発者は、メタデータ注釈またはデプロイメント・ディスクリプタのいずれかを使用して、リソース、EJBコンテキストまたは環境エントリを挿入できます。

  • インターセプタ - インターセプタ・メソッドまたはインターセプタ・クラスは、ステートフルとステートレスの両方のセッションBeanでサポートされます。

メッセージドリブンBean (MDB)

  • Beanの簡素化 - メッセージドリブンBeanはjavax.ejb.MessageDrivenインタフェースを実装する必要がなく、javax.jms.MessageListenerインタフェースを実装します。

  • メタデータ注釈 - メタデータ注釈は、BeanまたはインタフェースおよびMDBのランタイム・プロパティを指定するために使用されます。たとえば、MDBは、Beanタイプを指定するために@MessageDrivenでマークされます。

  • ライフサイクル・メソッドおよびコールバック・リスナー - コールバック・リスナーは、MDBでサポートされます。これらのコールバック・メソッドは、注釈またはデプロイメント・ディスクリプタを使用して指定されます。

  • 依存性インジェクション - 依存性インジェクションは、MDBから使用されます。メタデータ注釈またはデプロイメント・ディスクリプタのいずれかを使用して、MDBで使用されるリソース、EJBコンテキストまたは環境エントリを挿入します。

  • インターセプタ - インターセプタ・メソッドまたはインターセプタ・クラスは、MDBで使用できます。

エンティティ - Java永続性API (JPA)

  • Beanの簡素化(POJO永続性): EJB 3.0ではエンティティBeanが大幅に簡素化され、POJO永続性モデルが標準化されます。エンティティBeanは具体的なJavaクラスであり、インタフェースは不要です。エンティティBeanクラスはポリモフィズムと継承をサポートします。エンティティには様々なタイプの関連を設定でき、コンテナ管理の関連性は開発者によって手動で管理されます。

  • EntityManager API: EJB 3.0では、エンティティの作成、検索、削除および更新に使用されるEntityManager APIが導入されています。EntityManager APIは、Value Objectパターンに似たエンティティBeanインスタンスの連結解除/マージの概念を導入します。Beanインスタンスは連結解除され、クライアントによってローカルで更新された後エンティティ・マネージャに戻され、データベースとマージ/同期化されます。

  • メタデータ注釈: メタデータ注釈は、デプロイメント・ディスクリプタの要件を削除することで、エンティティの開発を大幅に簡素化します。エンティティ注釈は、エンティティBeanになるクラスを指定するために使用されます。注釈は、トランザクション属性、セキュリティ権限、コールバック・リスナーおよび注釈付き問合せを指定するために使用されます。

  • 問合せ言語の強化: EJB 3.0では、Java永続性問合せ言語(JPQL)によってエンティティの問合せ機能が大幅に向上しています。JPQLは、バルク更新と削除、JOIN操作、GROUP BY HAVING、投影、サブ問合せなどの追加操作によりEJB-QLを強化します。EJB QLを使用して動的問合せを作成することもできます。

  • ライフサイクル・メソッドおよびコールバック・リスナー - コールバック・リスナーは、エンティティBeanでサポートされます。コールバック・メソッドは、注釈またはデプロイメント・ディスクリプタを使用して指定されます。

28.3 EJB 3.xアプリケーションのビルドおよび開発プロセス

JDeveloperには、エンタープライズ・アプリケーションのEJBビジネス・レイヤーの設定するための完全機能セットが含まれます。

段階的ウィザードを使用してEJB Webアプリケーション用のフレームワークを作成し、エンタープライズ・アプリケーションのモデル・レイヤーを設定することから開始できます。次に、ウィザードを使用して、データベース表に相当するエンティティを作成できます。さらに、ウィザードを使用して、セッションBeanおよびセッション・ファサードを作成し、永続性ユニットを構築できます。Oracle ADFには、データ・コントロールを可能にするコンポーネントが用意されています。準備が整ったら、JDeveloper統合サーバー機能を使用してこれをテストできます。

28.3.1 EJB 3xアプリケーションの開発プロセス

JDeveloperには、次の項目で説明するように、EJBアプリケーションを開発するためのツールが含まれます。

28.3.1.1 エンティティの作成

エンティティ・ウィザードを使用して、エンティティを作成、またはオンライン、オフラインまたはアプリケーション・サーバー・データソース接続を使用して表からエンティティを作成します。「表からのエンティティ」ウィザードを使用して、データベース表からエンティティをリバース・エンジニアリングします。エンティティ・ウィザードでは、永続性ユニットおよびデータベース接続を選択または追加したり、エミュレートするデータベースを選択したりできます。また、自分のエンティティ用のデータベース表を選択することもできます。詳細は、第28.7.2項「JPAエンティティの作成方法」を参照してください。

エンティティは、既存の表から作成するか、またはJavaソース・エディタを使用して手動で作成できます。既存の表からエンティティを作成する場合、マッピングは自動的に行われます。O-Rマッピング・メタデータを使用してエンティティを手動で作成した場合、マッピングに対する制御を増強できますが、注釈のコーディングを手動で行う必要があります。詳細は、第28.7.1.2項「O-Rマッピングに関するメタデータ注釈」を参照してください。

28.3.1.2 セッションBeanおよびセッション・ファサードの作成

セッションBeanを使用して、セッション・ファサード・デザイン・パターンを実装できます。セッション・ファサードはデータを集約して表示し、ビジネス・ロジックに場所を提供し、コンテナを介してトランザクション・コンテキストを設定します。詳細は、第28.8項「セッションBeanでのビジネス・プロセスの実装」および第28.8.1項「セッション・ファサードの使用」を参照してください。

ウィザードを使用してセッションBeanを作成する場合、同じプロジェクト内のすべてのエンティティのセッション・ファサード・メソッド生成を選択できます。生成するコア・トランザクション・メソッド、get()アクセッサとset()アクセッサ、およびエンティティ上のファインダ・メソッドを選択できます。新しいエンティティ、またはエンティティ上の新しいメソッドを作成する場合、既存のセッション・ファサードを更新するには、「アプリケーション」ウィンドウでそのセッション・ファサードを右クリックし、「セッション・ファサードの編集」を選択します。

28.3.1.3 EJBのデプロイ

JDeveloperには、デプロイしたEJBのコンテナとしてOracle WebLogic Serverが用意されています。デフォルトでは、JDeveloperサーバー固有のデプロイメント・プロファイルが生成されます。WebLogic固有のデプロイメント・プロファイルを作成することもできます。詳細は、第28.11項「EJBモジュールおよびJPA永続性ユニットのデプロイ」を参照してください。

28.3.1.4 EJBのリモート・テスト

JDeveloperでは、リモート・サーバーで使用するサンプル・クライアントも作成できます。サンプル・クライアントの生成方法は、リモート接続の詳細を指定する以外は、ローカル・クライアントの場合と同様です。詳細は、第28.12.2項「リモート・サーバーを使用したEJB/JPAコンポーネントのテスト方法」を参照してください。

28.3.1.5 Oracle ADFデータ・コントロールへのビジネス・サービスの登録

ADFには、エンティティのデータ・コントロールを可能にするコンポーネントが用意されています。エンティティのデータ・コントロールを手動で追加すると、Java EEアプリケーションによって選択的コンポーネントが統合されます。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のADFデータ・コントロールの使用に関する項を参照してください。

28.4 EJBビジネス・サービス・レイヤーの使用方法

WebベースのEJB 3xアプリケーションのためのモデル・ビジネス・サービス・レイヤーを作成します。

Webベースのアプリケーションを作成するには、次のようにします。

  • 「ファイル」→「新規」→「アプリケーション」を選択します。

    「新規ギャラリ」の「一般」カテゴリに使用可能なアプリケーションの一覧が表示されます。EJBプロジェクトの場合、カスタム・アプリケーションまたはJava EEのWebアプリケーションをビルドすることを選択できます。Java EEのWebアプリケーションにより、EJB/JPAのデータバインドされたWebアプリケーションが作成されます。

    ヒント: よく使用される選択項目は、容易にアクセスできるように「新規」メニューに保存されます。

JPAエンティティを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、JPAエンティティを作成するプロジェクトを右クリックし、「新規」をクリックします。

  2. 「新規ギャラリ」で、「ビジネス層」を開き、「EJB」を選択し、さらに「エンティティ」または「表からのエンティティ」を選択して、「OK」をクリックします。

    ヒント: よく使用される選択項目は、容易にアクセスできるように「新規」メニューに保存されます。

  3. 「永続性ユニット」ページにアクセスしたら、「次へ」をクリックしてデフォルトの永続性ユニットpersistence.xmlを自動的に作成するか、「新規」をクリックして既存のMETA-INF/persistence.xmlファイル内に新規の永続性グループを作成します。

  4. 「エンティティ」または「表からのエンティティ」ウィザードのその他の手順を実行して、JPAエンティティを作成します。

    詳細は、随時[F1]を押すか、ウィザード内で「ヘルプ」をクリックしてください。

セッション・ファサードを実装するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、セッション・ファサードを作成するプロジェクトを右クリックし、「新規」を選択します。

  2. 「新規ギャラリ」で、「ビジネス層」を開いて「EJB」を選択し、さらに「Javaサービス・ファサード(JPA/Toplink)」を選択して、「OK」をクリックします。

    ヒント: よく使用される選択項目は、容易にアクセスできるように「新規」メニューに保存されます。

  3. 「Javaサービス・ファサード」ウィザードの手順を実行します。

    「EJBの名前とオプション」ページにアクセスする際、必ず「セッション・ファサード・メソッドの生成」を選択してください。こうしておくと、セッション・ファサード・メソッドが自動的にセッションBeanに追加されます。セッションBeanを右クリックして、「セッション・ファサードの編集」を選択することで、プロジェクト内のすべてのエンティティのセッション・ファサード・メソッドを作成および編集できます。JDeveloperでは、プロジェクト内の新しいエンティティおよびエンティティ上の新しいメソッドが自動的に認識されます。

    詳細は、随時[F1]を押すか、ウィザード内で「ヘルプ」をクリックしてください。

データ・コントロールを使用してビジネス・サービスのモデル・プロジェクトを登録するには、次のようにします。

  • 「アプリケーション」ウィンドウでセッションBeanを右クリックし、「データ・コントロールの作成」を選択します。

    これにより、セッションBeanを処理するようにデータ・コントロールを初期化するための情報が含まれるDataControls.dcxと呼ばれるファイルが作成されます。

アプリケーションを実行およびテストするには、次のようにします。

  • WebベースのEJBアプリケーション用のモデル・レイヤーの基本フレームワークを作成しました。このフレームワークを使用して、アプリケーションを構築する過程でアプリケーションをテストします。詳細は、第28.12項「EJB/JPAコンポーネントの実行およびテスト」を参照してください。

アプリケーションをデプロイするには、次のようにします。

統合サーバーはJDeveloper内で動作します。このサーバーを使用すると、EJBの実行およびテストが可能であり、何の変更も加えずにそのEJBをデプロイできます。このサーバーを使用する場合、デプロイメント・プロファイルは不要で、初期化の必要もありません。「デプロイメント・ディスクリプタ」ウィザードを使用してデプロイメント・ディスクリプタejb-jar.xmlを作成してから、アプリケーションを使用したデプロイメント用としてEJBモジュールをパッケージ化します。

28.5 Oracle JDeveloperでのJava EEデザイン・パターンの使用

Java EEデザイン・パターンは、定型的な設計に関する問題を解決するためのベスト・プラクティスをまとめたものです。各パターンは様々な問題に応用できる既成のソリューションであり、成功を収めたJava EE開発者の経験を活用しています。

JDeveloperを使用すると、EJBアプリケーションに次のJava EEデザイン・パターンを実装できます。

  • MVC - MVCパターンでは、アプリケーションはモデル、ビューおよびコントローラという3つの部分に分割されます。モデルはアプリケーションのビジネス・サービスを表し、ビューはアプリケーションのうちクライアントがアクセスする部分です。コントローラはアプリケーションのフローとアクションを制御し、モデルとビューの間にシームレスな相互作用をもたらします。プロジェクトの開始時にFusion Webアプリケーション(ADF)テンプレートまたはJava EE Webアプリケーション・テンプレートを選択すると、MVCパターンが自動的に実装されます。

  • セッション・ファサード - セッション・ファサード・パターンには、下位レベルEJB (通常はJPAエンティティ)が含まれており、EJB間の複雑な相互作用が集中化されます。また、アプリケーションのビジネス・サービスに対して単一のインタフェースを提供します。詳細は、第28.8項「セッションBeanでのビジネス・プロセスの実装」を参照してください。

  • ビジネス委任 - ビジネス委任パターンにより、クライアントとビジネス・サービスが切り離され、ビジネス・サービスの基礎となる実装詳細が隠されます。ビジネス委任パターンは、JDeveloperの「データ・コントロール・パレット」に表示されるデータ・コントロールにより実装されます。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のADFデータ・コントロールの使用に関する項を参照してください。

28.6 Java EE Contexts and Dependency Injection (CDI)の使用

Java EEプラットフォームのContexts and Dependency Injection (CDI)はサービスのセットです。これらを併用することで、開発者はWebアプリケーションでエンタープライズBeanをJavaServer Facesテクノロジと一緒に使用しやすくなります。

CDIで提供される最も基本的なサービスは次のとおりです。

  • コンテキスト: ステートフル・コンポーネントのライフサイクルと相互作用を、明確に定義されているが拡張可能なライフサイクル・コンテキストにバインドする機能。

  • 依存性インジェクション: コンポーネントを型安全な方法でアプリケーションに挿入する機能。たとえば、特定のインタフェースのどの実装を挿入するかをデプロイメント時に選択できます。依存性インジェクションは、ステートフル・セッションBeanまたはステートレス・セッションBeanのいずれかからメッセージドリブンBeanとともに使用されます。開発者は、メタデータ注釈またはデプロイメント・ディスクリプタのいずれかを使用して、EJBで使用されるリソース、EJBコンテキストまたは環境エントリを挿入できます。

  • インターセプタ: ビジネス・メソッドの呼出しを捕捉するメソッドです。インターセプタ・メソッドは、ステートレス・セッションBean、ステートフル・セッションBeanまたはメッセージドリブンBeanで定義されます。Beanクラスでインターセプタ・メソッドを定義するかわりに、インターセプタ・クラスが使用されます。

CDIの詳細は、Java EE 6チュートリアル「Java EEプラットフォームのContexts and Dependency Injectionの概要」を参照してください。

EJB 3.xの場合、CDIの次の機能がJDeveloperでサポートされます。

28.6.1 beans.xmlファイル

CDI (Contexts and Dependency Injection)を使用するアプリケーションにはbeans.xmlファイルが必要です。アプリケーションがEJBプロジェクトの一部の場合(プロジェクトの.jprファイルに基づく)、beans.xmlファイルは、そのプロジェクトのMETA-INFディレクトリに生成されます。Webアプリケーションなどの他のすべてのタイプのアプリケーションの場合、beans.xmlファイルは、そのプロジェクトのWEB-INFディレクトリに生成されます。beans.xmlファイルは空でも構いません。

マネージドBeanの詳細は、Java EE 6チュートリアル「Beanについて」を参照してください。

beans.xmlファイルを作成するには:

  1. 「アプリケーション」ウィンドウでプロジェクトを選択して、「ファイル」メニューから「新規」→「ギャラリから」を選択します。

  2. 「新規ギャラリ」で、「ビジネス層」「Contexts and Dependency Injection」を開き、「beans.xml(Contexts and Dependency Injection)」を選択して、「OK」をクリックします。

  3. 「アプリケーション」ウィンドウで、「Webコンテンツ」フォルダを参照し、「beans.xml」ファイルをダブルクリックしてJavaソース・エディタで開きます。

  4. 「一般」タブの次のオプションを使用して、beans.xmlファイルで次の子要素を1つ以上定義します。

    • インターセプタ: インターセプタは、ロギングや監査といった横断タスクの実行に使用されます。これらのタスクは、アプリケーションのビジネス・ロジックから分離されており、多くの場合、アプリケーション内で繰り返されます。インターセプタを使用すると、これらのタスクのコードを1箇所で指定できるため、メンテナンスが容易になります。インターセプタの詳細は、Java EE 6チュートリアルCDIアプリケーションでのインターセプタの使用に関する項を参照してください。

    • デコレータ: デコレータは、外見上はインターセプタと類似していますが、実際はBeanのビジネス・メソッドを捕捉することでビジネス・ロジックを実行します。つまり、そのロジックは、インターセプタのように各種アプリケーションで再利用できず、特定のアプリケーションに固有なものになります。デコレータの詳細は、Java EE 6チュートリアルCDIアプリケーションでのデコレータの使用に関する項を参照してください。

    • 代替: 様々な目的に使用される、複数のバージョンのBeanがある場合、代替を使用してそれらを選択できます。たとえば、完全バージョンのBeanがあり、さらに特定の種類のテストにのみ使用する簡易バージョンもあるとします。代替の詳細は、Java EE 6チュートリアルCDIアプリケーションでの代替の使用に関する項を参照してください。

28.6.2 インターセプタ・バインディング・タイプ

インターセプタ・バインディングは、インターセプタを、マネージドBean (それ自体はインターセプトやデコレータではない)やEJBセッション、またはメッセージドリブンBeanに関連付けるJava注釈です。

インターセプタの詳細は、Java EE 6チュートリアルCDIアプリケーションでのインターセプタの使用に関する項を参照してください。

インターセプタ・バインディング・タイプを作成するには:

  1. 「アプリケーション」ウィンドウでプロジェクトを選択して、「ファイル」メニューから「新規」→「ギャラリから」を選択します。

  2. 「新規ギャラリ」で、「ビジネス層」「Contexts and Dependency Injection」を開き、「インターセプタ・バインディング・タイプ」を選択して、「OK」をクリックします。

  3. インターセプタ・バインディング・タイプの作成ダイアログで、名前を入力して、その作成先のパッケージを選択し、「OK」をクリックします。

  4. 「アプリケーション」ウィンドウで、新規作成したファイルを選択してJavaソース・エディタで開きます。

    例28-1に、CDIインターセプタ・バインディング・タイプの注釈を示します。

    例28-1 インターセプタ・バインディング・タイプの注釈

    package demo;
     
    import static java.lang.annotation.ElementType.METHOD;
    import static java.lang.annotation.ElementType.TYPE;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    import java.lang.annotation.Target;
     
    import javax.interceptor.InterceptorBinding;
     
    @Retention(RUNTIME)
    @Target({ METHOD, TYPE })
    @InterceptorBinding
    @Inherited
    public @interface InterceptorBinding1 {
    }
    

28.6.3 修飾子タイプ

修飾子タイプは、特定タイプのBeanの各種実装を提供する場合に使用可能なJava注釈です。

修飾子の詳細は、Java EE 6チュートリアル修飾子の使用に関する項を参照してください。

修飾子タイプを作成するには:

  1. 「アプリケーション」ウィンドウでプロジェクトを選択して、「ファイル」メニューから「新規」→「ギャラリから」を選択します。

  2. 「新規ギャラリ」で、「ビジネス層」「Contexts and Dependency Injection」を開き、「修飾子タイプ」を選択して、「OK」をクリックします。

  3. 修飾子タイプの作成ダイアログで、修飾子タイプの名前を入力し、「OK」をクリックして、現在のパッケージ内に作成します。「参照」をクリックして、別のパッケージを選択することもできます。

  4. 「アプリケーション」ウィンドウで、新規作成した修飾子タイプのJavaファイルを選択してJavaソース・エディタで開きます。

    例28-2に、CDI修飾子タイプの注釈を示します。

    例28-2 修飾子タイプの注釈

    package demo;
    import static java.lang.annotation.ElementType.FIELD;
    import static java.lang.annotation.ElementType.METHOD;
    import static java.lang.annotation.ElementType.PARAMETER;
    import static java.lang.annotation.ElementType.TYPE;
    import java.lang.annotation.Retention;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    import java.lang.annotation.Target;
     
    import javax.inject.Qualifier;
     
    @Retention(RUNTIME)
    @Target({ METHOD, FIELD, PARAMETER, TYPE })
    @Qualifier
    public @interface Qualifier1 {
    }
    

28.6.4 スコープ・タイプ

別のBeanクラスを挿入するBeanを使用するWebアプリケーションの場合、ユーザーがアプリケーションとやり取りする間、Beanの状態を保持できるようにしておく必要があります。この状態を定義するには、@RequestScoped@SessionScopedまたは@ApplicationScopedなどのスコープをBeanに指定します。

スコープの詳細は、Java EE 6チュートリアルスコープの使用に関する項を参照してください。

スコープ・タイプを作成するには:

  1. 「アプリケーション」ウィンドウでプロジェクトを選択して、「ファイル」メニューから「新規」→「ギャラリから」を選択します。

  2. 「新規ギャラリ」で、「ビジネス層」「Contexts and Dependency Injection」を開き、「スコープ・タイプ」を選択して、「OK」をクリックします。

  3. 「スコープ・タイプ」ダイアログで、スコープ・タイプの名前を入力し、「OK」をクリックして、現在のパッケージ内に作成します。「参照」をクリックして、別のパッケージを選択することもできます。

  4. 「アプリケーション」ウィンドウで、新規作成したファイルを選択してJavaソース・エディタで開きます。

    例28-3に、CDIスコープ・タイプの注釈を示します。

    例28-3 スコープ・タイプの注釈

    package demo;
    import static java.lang.annotation.ElementType.FIELD;
    import static java.lang.annotation.ElementType.METHOD;
    import static java.lang.annotation.ElementType.TYPE;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    import java.lang.annotation.Target;
    
    import javax.inject.Scope;
    
    @Retention(RUNTIME)
    @Target({ METHOD, FIELD, TYPE })
    @Scope
    @Inherited
    public @interface Scope1 {
    }
    

28.6.5 ステレオタイプ

ステレオタイプは、他の注釈を組み込む注釈のタイプで、Beanに適用されます。ステレオタイプは、同様の機能を実行するBeanが複数あるような大規模アプリケーションで特に役立ちます。

ステレオタイプの詳細は、Java EE 6チュートリアルCDIアプリケーションでのステレオタイプの使用に関する項を参照してください。

ステレオタイプを作成するには:

  1. 「アプリケーション」ウィンドウでプロジェクトを選択して、「ファイル」メニューから「新規」→「ギャラリから」を選択します。

  2. 「新規ギャラリ」で、「ビジネス層」「Contexts and Dependency Injection」を開き、「ステレオタイプ」を選択して、「OK」をクリックします。

  3. ステレオタイプの作成ダイアログで、名前を入力して、その作成先のパッケージを選択し、「OK」をクリックします。

  4. 「アプリケーション」ウィンドウで、新規作成したファイルを選択してJavaソース・エディタで開きます。

    例28-4に、CDIステレオタイプの注釈を示します。

    例28-4 ステレオタイプの注釈

    package demo;
    
    import static java.lang.annotation.ElementType.FIELD;
    import static java.lang.annotation.ElementType.METHOD;
    import static java.lang.annotation.ElementType.TYPE;
    import java.lang.annotation.Retention;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    import java.lang.annotation.Target;
    
    import javax.enterprise.inject.Stereotype;
    
    @Retention(RUNTIME)
    @Target({ METHOD, FIELD, TYPE })
    @Stereotype
    public @interface Stereotype1 {
    }
    

28.7 永続層の構築

永続層は、データベース内の表を表す永続性データ・オブジェクトがすべて含まれるEJBアプリケーションの一部です。EJB 3xで導入されたエンティティ・モデルはJava永続性APIで定義されているため、これらのビジネス・コンポーネントはJPAエンティティと呼ばれます。

28.7.1 JPAエンティティおよびJava永続性APIについて

JPAエンティティは、Oracle TopLinkおよびHibernateとシームレスに動作するよう設計された軽量永続性モデルを採用しています。

JPAエンティティの主な拡張機能は、次のとおりです。

  • POJOであるJPAエンティティ

  • O-Rマッピングのメタデータ注釈

  • 継承およびポリモフィズムのサポート

  • CRUD操作のためのEntityManager APIの簡素化

  • 問合せの拡張機能

28.7.1.1 POJOであるJPAエンティティ

JPAエンティティはPOJO (Plain Old Java Objects)であり、コンポーネント・インタフェースは不要です。JPAエンティティは、継承およびポリモフィズムもサポートしています。

例28-5に、単純なJPAエンティティのソース・コードを示します。

例28-5 単純なJPAエンティティのソース・コード

@Entity 
@Table(name = "EMP") 
public class Employee implements java.io.Serializable 
{
   private int empNo; 
   private String eName; 
   private double sal; 
   @Id 
   @Column(name="EMPNO", primaryKey=true) 
     public int getEmpNo() 
     {
       return empNo; 
     }
public void setEmpNo(int empNo)
{
  this.empNo = empNo; 
}
 public double getSal() 
{
   return sal; 
}
...
}

Beanクラスは、CMP 2.xエンティティBeanの場合と同様に、抽象クラスではなく具体的なクラスであることに注意してください。

28.7.1.2 O-Rマッピングのメタデータ注釈

O-Rマッピング注釈を使用すると、O-Rマッピング・メタデータを使用してエンティティを記述できます。その後、このメタデータは、エンティティの永続性および取得を定義するために使用されます。ベンダー固有のディスクリプタでO-R (オブジェクト・リレーショナル)マッピングを定義する必要はなくなります。

前述の例では、@Entity@Tableおよび@Column注釈を使用して、これがエンティティであることをクラス・レベルで指定するとともに、エンティティの基礎となるデータベース表と列名を指定しています。例28-6に示すように、マッピング注釈を使用して、エンティティ間の関連を定義することもできます。

例28-6 マッピング注釈

@ManyToOne(cascade=PERSIST) 
@JoinColumn(name="MANAGER_ID", referencedColumnName="EMP_ID") 
public Employee getManager() 
{
  return manager; 
}

28.7.1.3 継承およびポリモフィズムのサポート

継承は、様々な使用例で非常に役に立ちます。一般的に使用され、JPAエンティティ用のOracle Application Serverでサポートされる2つのタイプの継承は、次のとおりです。

  • クラス階層単位の単一表

  • 結合されたサブクラス戦略

継承は、注釈を使用して表すことができます。結合されたサブクラス戦略を使用するコード例を例28-7に示します。

例28-7 結合されたサブクラス戦略

@Entity 
@Table(name="EJB_PROJECT") 
@Inheritance(strategy=JOINED, discriminatorValue="P") 
@DiscriminatorColumn(name="PROJ_TYPE") 
public class Project implements Serializable 
{
...
}
@Entity 
@Table(name="EJB_LPROJECT") 
@Inheritance(discriminatorValue="L") 
public class LargeProject extends Project
{
...
}
@Entity 
@Table(name="EJB_PROJECT") 
@Inheritance(discriminatorValue="S") 
public class SmallProject extends Project 
{
...
}

28.7.1.4 CRUD操作のためのEntityManager APIの簡素化

javax.persistence.EntityManager APIは、エンティティ・インスタンスに対するCRUD (Create、Read、UpdateおよびDelete)操作に使用されます。インスタンスを参照して操作するために、コードを記述する必要はなくなります。例28-8のように、セッションBeanにEntityManagerのインスタンスを挿入し、EntityManagerインスタンスでpersist()またはfind()メソッドを使用して、エンティティBeanオブジェクトを作成または問い合せることができます。

例28-8 セッションBean内のEntityManager

@PersistenceContext
private EntityManager em; 
private Employee emp; 
    public Employee findEmployeeByEmpNo(int empNo) 
    { 
       return ((Employee) em.find("Employee",empNo)); 
     }
public void addEmployee(int empNo, String eName, double sal)
{ 
   if (emp == null) emp = new Employee(); 
   emp.setEmpNo(empNo); 
   ...
   em.persist(emp); 
}
}

28.7.1.5 問合せの拡張機能

問合せはメタデータ内で定義します。ここでは、注釈を使用して、またはデプロイメント・ディスクリプタ内で問合せを指定できます。JPAエンティティは、JPQL (Java永続性問合せ言語)を介してバルク更新および削除操作をサポートします。詳細は、第28.7.7項「EJB/JPAの注釈」を参照してください。

28.7.2 JPAエンティティの作成方法

JDeveloperには、JPAエンティティを作成するための簡単なウィザードが2つ用意されています。オンライン・データベースまたはオフライン・データベースからのエンティティの作成、永続性ユニットの追加、継承戦略の定義、および使用可能なデータベース・フィールドからの選択が可能です。「表からのエンティティ」ウィザードを使用すると、オンライン・データベースまたはエミュレートされたオフライン・データベースや、アプリケーション・サーバーのデータ・ソースからエンティティを作成できます。


注意:

「表からのエンティティ」ウィザードを実行している際に、「一般オプション」ページで「生成された各エンティティに対するIDジェネレータの添付」フィールドを構成した場合は、選択内容に応じて、オプション@SequenceGeneratorまたは@SequenceGeneratorに対してIDジェネレータを手動で構成する必要があります。追加の手順については、各エンティティ・クラスに生成されたJavadocを参照してください。

エンティティを作成、または表からエンティティを作成するには、次のようにします。

  1. メイン・メニューから「ファイル」→「新規」の順に選択します。

  2. 「新規ギャラリ」で、「ビジネス層」を開き、「EJB」を選択し、さらに「エンティティ」または「表からのエンティティ」を選択して、「OK」をクリックします。

    ヒント: よく使用される選択項目は、容易にアクセスできるように「ファイル」メニューに保存されます。

  3. 「エンティティ作成(表ベース)」または「エンティティの作成」ウィザードの手順を実行して、JPAエンティティを作成します。

    詳細は、随時[F1]を押すか、ウィザード内で「ヘルプ」をクリックしてください。

既存のプロジェクトにEJBを作成する手順は次のとおりです。

  1. 「アプリケーション」ウィンドウで、JPAエンティティを作成するプロジェクトを選択し、「新規」を選択します。

  2. 「新規ギャラリ」で、「ビジネス層」を開き、「EJB」を選択し、さらに「エンティティ」または「表からのエンティティ」を選択して、「OK」をクリックします。

    または、メイン・メニューから「ファイル」→「新規」を選択して「新規ギャラリ」を開き、ステップ2を実行します。

    ヒント: よく使用される選択項目は、容易にアクセスできるように「ファイル」メニューに保存されます。

  3. 「エンティティ作成(表ベース)」または「エンティティの作成」ウィザードの手順を実行します。

新規のプロジェクトにEJBを作成する手順は次のとおりです。

  1. メイン・メニューから「ファイル」→「新規」→「プロジェクト」を選択します。

  2. 「新規ギャラリ」で、作成するプロジェクトのタイプを選択し、「OK」をクリックします。

  3. 「アプリケーション」ウィンドウで、新規プロジェクトを右クリックして、「新規」を選択します(または、プロジェクトを選択して、メイン・メニューで「ファイル」→「新規」を選択します)。

    「新規ギャラリ」で、「ビジネス層」を開き、「EJB」を選択し、さらに「エンティティ」または「表からのエンティティ」を選択して、「OK」をクリックします。

    ヒント: よく使用される選択項目は、容易にアクセスできるように「ファイル」メニューに保存されます。

28.7.2.1 シリアライズ可能なインタフェースの使用

「表からのエンティティ」ウィザードを使用してEJBを作成する場合、エンティティの実装java.io.Serializableを(ウィザードの「一般オプション」ページ上で)使用できます。これを選択する場合、デフォルトのserialVersionUIDフィールドがエンティティ・クラスとして生成されます。たとえば、次のようになります。

public class Departments implements Serializable {
    private static final long serialVersionUID = -1771169464233198257L;
...

JDeveloperは、クラスを監査するたびに、VMがクラスに対して導出するserialVersionUIDを計算し、これを現在のserialVersionUIDクラス・プロパティと比較します。これらが同じ場合、クラスが変更されていないか、シリアライズに影響を与えるような方法で変更されていないことがわかります。

新しいserialVersionUIDが現在のserialVersionUIDフィールドと異なる場合、JDeveloperにより監査警告のフラグが付けられるため、その対処方法を決定する必要があります。

28.7.3 EJB/JPA用のSDOについて

JDeveloperは、SDO (サービス・データ・オブジェクト)データ・アプリケーション開発フレームワークをサポートします。

SDO 2.0フレームワークおよびAPIを使用すると、物理的にどのようにアクセスされているかに関係なくビジネス・データを簡単に修正できます。SDOは、バックエンド・データソースをカプセル化し、静的または動的なプログラミング・スタイルの選択肢を提供し、接続されたアクセスと切断されたアクセスの両方をサポートします。SDOは、XMLパーサー操作を処理し、データ解析ロジックを自動的にアプリケーションに統合します。詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』のサービス対応のアプリケーション・モジュールの統合に関する項を参照してください。

JDeveloperによってサポートされるSDOアーキテクチャには、次の機能があります。

  • Java EEデータ・プログラミング・モデルの簡素化

  • サービス指向アーキテクチャ(SOA)内のデータの抽出

  • クライアント間のデータの受渡しに関する標準的方法の作成によるデータ・アプリケーション開発の統合

  • XMLのサポートおよび統合

  • Java EEパターンおよびベスト・プラクティスの導入

SDOは、切断されたデータ・グラフの概念に基づくデータ・アプリケーション用の統合フレームワークです。データ・グラフは、ツリー構造またはグラフ構造のデータ・オブジェクトのコレクションです。データ・オブジェクトを操作する汎用コードまたはフレームワーク・コードの開発を実現するには、データ・オブジェクトのデータ・モデルを公開するデータ・オブジェクト・メタデータに対するイントロスペクションが可能であることが重要です。Javaリフレクションの代替策として、SDOは、EJB Beanに詳述されているエンティティまたはデータ・モデル情報に基づいて、作成するXMLスキーマ定義(XSD)ファイルに格納されているメタデータにアクセスするためのAPIを提供します。

28.7.4 SOAプラットフォームへのデプロイメント用のEJB/POJOベースのADF-BCサービスの使用

JDeveloperのSDO機能は、EJBサービスまたはADF-BCサービスとして使用できます。ADF-BCサービスの使用を選択する場合、weblogic-application.xmlファイルにリスナー参照を追加する必要があります。詳細は、第28.7.5項「JPAエンティティ用のSDOサービス・インタフェースの作成方法」を参照してください。

SDOの詳細および仕様は、OSOA (Open Service Oriented Architecture) (http://www.oasis-opencsa.org/sdo)を参照してください。

28.7.5 JPAエンティティ用のSDOサービス・インタフェースの作成方法

EJBセッションBeanまたはPlain Old Java Object (POJO)を介してJPAエンティティ・データにアクセスするためのサービス・インタフェースAPIを簡単に作成できます。このサービス・クラスは、JDeveloper Java EEアプリケーション内のJPAエンティティを作成、取得、更新および削除するための操作を公開します。

SDOサービス・インタフェースを作成するには、次のようにします。

  1. 1つ以上のJPAエンティティに対するCRUD操作を公開するEJBセッションBeanまたは通常のJavaクラス(POJO)から開始します。

    ウィザードを使用してセッションBeanを作成できます。詳細は、第28.8.2項「セッションBeanの作成方法」を参照してください。

  2. 「構造」ウィンドウで、EJBセッションBeanまたはPOJOを右クリックして「サービス・インタフェースの作成」を選択します。

  3. サービスAPIで使用可能にするメソッドを選択します。

    デフォルトでは、セッションBeanインタフェース内のすべてのメソッドが選択されます。チェック・ボックスをクリックして、メソッドを選択または選択解除します。

  4. このリリースでは、サービス・インタフェースを作成すると、元のセッションBeanファイルおよびリモート(またはローカル)インタフェースが変更されます。元のメソッドと一致する新規メソッドが追加されますが、これらは、JPAエンティティではなく、新しく定義されたSDOデータ・オブジェクトを参照します。これらのSDOデータ・オブジェクトは、JPAエンティティと一致し、XSDファイル(これもプロジェクトに追加されます)で定義され、これらの名前にはDeptSDOEmployeeSDOなどのようにSDOが付けられます。「バックアップ・ファイル」を選択し、元のセッションBeanファイルのバックアップを作成します。

  5. 「OK」をクリックします。

28.7.5.1 SOAプラットフォームへのデプロイメント用のEJB/POJOベースのADF-BCサービスの構成方法

SDO外部バインディングを使用してファブリック・コンポジットからEJB/POJO SDO ADF-BCサービスを使用するには、ServiceRegistryロジックを呼び出すためのWeblogicアプリケーション・デプロイメント・リスナーを設定する必要があります。これを設定するには、weblogic-application.xmlファイルにリスナー参照を追加します。

リスナー参照を追加するには、次のようにします。

デフォルトでは<workspace-directory>/src/META-INFにあるweblogic-application.xml例28-9のコードを追加します。

例28-9 weblogic-application.xmlに追加するコード

<listener>
<listener-class> oracle.jbo.client.svc.ADFApplicationLifecycleListener
</listener-class>
</listener>

このリスナーが追加されると、SDOサービス・アプリケーション名_JBOServiceRegistry_composite.xml内のファブリック・サービス・レジストリに自動的に登録されます。

28.7.5.2 SDOアーキテクチャをサポートするために作成されるファイル・タイプ

SDOサービス・インタフェースを作成すると、サービス・インタフェースをサポートするために必要なファイルが自動的に作成されます。これらのファイルには、次のものがあります。

  • SessionEJBBeanWS.wsdl - このファイルには、SOAアプリケーションへのエントリ・ポイントまたはSOAアプリケーションからの参照ポイントを提供するサービスの機能が記述されています。WSDLファイルは標準規約言語を提供するもので、サービスの機能を理解する場合に必須です。

  • SessionEJBBeanWS.xsd - これは、SDOデータ型の観点からサービス・インタフェース・メソッドを定義するXMLスキーマ・ファイルです。セッションBeanインタフェースに含まれていたすべてのエンティティが、このスキーマ・ファイル内で対応するDataObject要素を持つことになります。実行時には、XSDHelper.INSTANCE.define()メソッドをコールすることにより、これらのDataObjectsがSDOランタイムに登録されます。SDOタイプごとに静的タイプ固有のDataObjectが定義されます。

28.7.6 JPAエンティティからのデータベース表の生成方法

JDeveloper統合サーバーにJPAエンティティをデプロイすると、対応する既存の表がマップされていないすべてのエンティティにデータベース表が自動的に作成されます。マップされていないJPAエンティティごとに、1つのデータベース表が生成されます。


注意:

主キー参照整合性制約が生成されますが、その他の制約は生成されない場合があります。

JPAエンティティからデータベース表を生成するには、次のようにします。

  1. モデリング・ツールまたは「エンティティの作成」ウィザードを使用して、JPAエンティティを作成します。詳細は、第28.7.2項「JPAエンティティの作成方法」を参照してください。

  2. 必要に応じてエンティティを変更し、フィールドおよび制約を追加します。

  3. 表に名前を付けます:

  4. 永続性ユニットをデプロイします。詳細は、第28.11項「EJBモジュールおよびJPA永続性ユニットのデプロイ」を参照してください。

28.7.7 EJB/JPA用の注釈

注釈を使用すると、アプリケーション・コンポーネントに必要なデプロイメント・ディスクリプタの数を減らすことによって開発タスクを簡素化できます。また、注釈は、インタフェースなどのアーティファクトの生成にも使用できます。

注釈は、Javaソース・ファイルに追加されるメタデータ修飾子です。注釈は、コンパイル時にJavaコンパイラによってクラスにコンパイルされ、クラス、フィールド、メソッド、パラメータ、ローカル変数、コンストラクタ、列挙およびパッケージで指定できます。注釈を使用すると、コードの生成、コードの文書化、または実行時の高度なビジネスレベル・セキュリティや特別なビジネス・ロジックなどのサービスの提供のための属性を指定できます。

また、EJB/JPAクラスで使用可能な注釈のタイプはすべてXMLデプロイメント・ディスクリプタ・ファイルに追加することもできます。実行時には、XMLにより、クラス・レベルで追加された任意の注釈がオーバーライドされます。

次のステートレス・セッションBeanのように、注釈には@記号がマークされます。

@Stateless public class MySessionBean

EJB 3xの注釈の詳細は、http://download.oracle.com/javase/1.5.0/docs/guide/language/annotations.htmlを参照してください。


注意:

注釈はEJB 3xの新機能であり、EJBの前のバージョンでは使用できません。

デザインタイム時には、「プロパティ」ウィンドウを通して使用可能な注釈のリストが表示されます。注釈機能を使用すると、任意の適切なJavaクラスをEJBまたはJPAコンポーネントに変更できます。詳細は、第28.7.8項「Javaクラスの注釈方法」を参照してください。

28.7.7.1 EJB 3.x

注釈を使用してBeanタイプを示すことができます。Beanタイプの注釈を標準クラスに追加すると、EJBになります。

次のタイプの注釈を使用できます。

  • ステートレス・セッションBeanです。「True」または「False」を選択し、ステートレス・セッションBeanとしてクラスに注釈を付けます。

  • ステートフル・セッションBeanです。「True」または「False」を選択し、ステートフル・セッションBeanとしてクラスに注釈を付けます。

  • これは、シングルトン・セッションBeanです。「True」または「False」を選択し、シングルトン・セッションBeanとしてクラスに注釈を付けます。

  • メッセージドリブンBeanです。「True」または「False」を選択し、メッセージドリブンBeanとしてクラスに注釈を付けます。

28.7.7.2 JPA 2.0

注釈は、新規Java永続性APIをエンティティBeanの代替手段としてサポートします。

次のタイプの注釈を使用できます。

  • JPAエンティティです。「True」または「False」を選択し、JPAエンティティとしてクラスに注釈を付けます。

  • JPAマップされたスーパークラスです。「True」または「False」を選択し、JPAマップされたスーパークラスとしてクラスに注釈を付けます。

  • JPA埋込み可能です。「True」または「False」を選択し、JPA埋込み可能としてクラスに注釈を付けます。

標準JavaクラスをEJB/JPAコンポーネントに変換した後、またはEJB/JPAウィザードの1つを使用してコンポーネントを作成した場合、「プロパティ」ウィンドウには、異なるコンテキスト・オプション・セットが表示され、これを使用して、コンポーネント・クラス内の様々なメンバーの注釈を追加または編集できます。

28.7.8 Javaクラスの注釈方法

設計時には、クラスに挿入可能な注釈のリストが表示されます。これらのオプションは、使用しているクラスのタイプや選択したメンバーの内容によって異なります。

任意の標準Javaクラスに注釈を付けてEJB/JPAコンポーネントにすることができます。注釈を使用してクラスをEJB/JPAとして定義した後、JDeveloperの「プロパティ」ウィンドウ内で選択可能な様々なメンバー・レベルの注釈を使用してコンポーネントを簡単にカスタマイズできます。


注意:

注釈はEJB 3xでのみ使用可能であり、EJBの前のバージョンでは使用できません。

JavaクラスにEJB/JPAコンポーネントとして注釈を付けるには、次のようにします。

  1. 「アプリケーション」ウィンドウで、変換するクラスを選択します。

  2. 「構造」ウィンドウで、クラス名をダブルクリックします。

    クラスがJavaソース・エディタで開いている場合、クラス定義行にカーソルを置きます。

  3. 「プロパティ」ウィンドウを開き、「EJB」/「JPA」タブを選択して、作成するコンポーネントのタイプを選択します。「True」を選択します。

JavaクラスがEJB/JPAコンポーネントとして注釈を付けられると、「プロパティ」ウィンドウでは「EJB/JPA」タブが表示されなくなり、選択したコンポーネント・タイプに固有の新規タブが表示されます。コンポーネントを標準Javaクラスに戻すには、コードから注釈を削除し、「プロパティ」ウィンドウに表示されているEJB/JPAコンポーネント・タイプをリセットします。


注意:

ウィザードを介して作成されたEJBまたはJPAコンポーネントには、すでにクラス・タイプの注釈が含まれます。詳細は、第28.3項「EJB 3xアプリケーションのビルドおよび開発プロセス」を参照してください。

クラス・レベルの注釈を使用してJavaクラスがEJB/JPAコンポーネントに変換されたら、「プロパティ」ウィンドウを使用して、このコンポーネント内のメンバー・フィールドまたはメソッドに対する注釈を追加または編集します。

EJB/JPAコンポーネント内の注釈を追加または編集するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、注釈をつけるクラスを選択します。

  2. 「構造」ウィンドウで、注釈を付けるメンバーをダブルクリックします。

    クラスがJavaソース・エディタで開いている場合、かわりに注釈を挿入する場所にカーソルを置きます。

  3. 「プロパティ」ウィンドウで、指定したEJB/JPAタイプに対応するタブを選択します。

  4. 選択した特定のメンバーで使用可能な任意の注釈から選択します。

28.7.9 エンティティ間の関連の表現

データベース表からエンティティを作成すると、外部キーはエンティティ間の関連として解析されます。これらの関連をさらに定義したり、新規関連を作成したり、JDeveloperのモデリング・ツールを使用して既存の関連を既存の表にマップできます。モデリング・ツールを使用すると、関連をエンティティ間の線で表したり、線の構成を変更することによって関連を変更できます。詳細は、第5.11項「EJBダイアグラムによるモデリング」を参照してください。

28.7.10 Java永続性問合せ言語

Java永続性問合せ言語(JPQL)では、デプロイメント・ディスクリプタに抽象スキーマ型および関連を導入することで、エンティティBeanと依存クラスの間の関連を定義する標準的な方法が提供されます。JPQLでは、抽象スキーマ名および関連を使用して、ナビゲーションに対する問合せも定義されます。

JPQLの問合せ文字列は、2つの必須句(SELECTおよびFROM)およびオプションのWHERE句から構成されます。次に例を示します。

select d from Departments d where d.department_name = ?1

JPQLを使用するメソッドには、finderメソッドとselectメソッドの2種類があります。

  • ファインダ・メソッドはクライアントに公開され、1つのインスタンス、またはエンティティBeanインスタンスのコレクションのいずれかを返します。

  • selectメソッドはクライアントに公開されず、cmp-field型のインスタンス、またはcmr-fieldによって表されるリモート・インタフェースを返すために内部で使用されます。

28.7.11 JPAオブジェクト・リレーショナル・マッピング

Java永続性APIを使用すると、Java EE 5アプリケーション・サーバーの内部とEJBコンテナの外部の両方で動作する標準的で移植可能な方法でJavaオブジェクトをリレーショナル・データベース表に宣言的にマップできます。このアプローチの場合、Java永続性が大幅に簡素化され、オブジェクト・リレーショナル・マッピング・アプローチが提供されます。

Oracle TopLinkでは、Javaソース・コード内のメタデータ注釈を使用してエンティティのJPA動作を構成できます。実行時に、コードは対応するJavaクラス・ファイルにコンパイルされます。

JavaクラスをJPAエンティティとして指定するには、例28-10に示すように、@Entity注釈を使用します。

例28-10 エンティティ注釈

@Entity
public class Employee implements Serializable {
...
}

注釈を選択して追加し、デプロイメント・ディスクリプタに指定されているデフォルトをオーバーライドできます。

JPA注釈の詳細は、TopLink JPA注釈参照(http://www.oracle.com/technetwork/middleware/ias/toplink-jpa-annotations-096251.html)を参照してください。

28.7.12 Javaサービス・ファサードの使用方法

Javaサービス・ファサードは、アプリケーション・サーバーなしで実行可能な軽量テスト環境を実装します。EJB 3xの場合、Javaサービス・ファサードは、コンテナなしで同じ永続性ユニットのエンティティに対してファサード・メソッドを生成できるため、EJBセッション・ファサードと類似しています。

ワークフローをJavaサービス・ファサードと分離すると、参加者JPAオブジェクトにクライアントが直接依存しなくなるため、設計の柔軟性が高まります。参加者を変更するにはJavaサービス・ファサードの変更が必要になる可能性がありますが、ワークフローをファサード内で集中管理すると、このような変更をより管理しやすくなります。すべてのクライアントを変更しなくてもJavaサービス・ファサードを変更するだけですみます。また、ワークフローの職責がセッション・ファサードに委任されたため、クライアント・コードもより単純になりました。クライアントは、ビジネス・オブジェクト間の複雑なワークフロー相互作用を管理する必要がなくなっただけでなく、ビジネス・オブジェクト間の相互依存性も認識する必要はありません。

Javaサービス・クラスを実行できるようにするには、サンプルのPOJO Javaクライアントをmain()メソッドで生成します。このメソッドにより、「メッセージ」ペインに実行中の出力が表示されます。あるいは、結果を整形式の表でブラウザに表示するサーブレットベースのクライアントを生成できます。

JDeveloperの「Javaサービス・ファサード」ウィザードは、エンティティに対するサービス・ファサードとしてJavaクラスを作成する際に使用します。新規Javaサービス・ファサードを作成するには、メイン・メニューから「ファイル」→「新規」を選択し、さらに「新規ギャラリ」「ビジネス層」を開いて「EJB」を選択し、「Javaサービス・ファサード」を選択して「OK」をクリックします。

また、サービス・ファサードからデータ・コントロールを作成することもできます。「アプリケーション」ウィンドウで、サービス・ファサードの名前を右クリックして「データ・コントロールの作成」を選択します。「Beanデータ・コントロール・インタフェース・チューザ」ダイアログから、oracle.binding.*データ・コントロール・インタフェースの実装を選択できます。このインタフェースには、TransactionalDataControlUpdatableDataControlおよびManagedDataControlがあります。詳細は、ダイアログで「ヘルプ」ボタンを選択してください。

28.7.13 エンティティの主キーの定義方法

主キーは、1つ以上の持続属性を持つ一意の識別子です。これは、同じタイプの他のすべてのインスタンスからクラスの1つのインスタンスを識別します。主キーは、リレーションシップの定義および問合せの定義に使用します。

JPAエンティティ・インスタンスごとに1つの主キーが必要です。データベース・スキーマに応じて、永続フィールドからシンプル主キーを定義したり、複数の永続フィールドからコンポジット主キーを定義できます。また、自動主キー値生成を定義し、JPAエンティティ実装を簡素化することもできます。

シンプル主キーを指定する最も簡単な方法は、単一のプリミティブに対する注釈を使用するか、JDKオブジェクト・タイプ・エンティティ・フィールドを主キーとして使用することです。また、マッピング・ディスクリプタXML (orm.xmlファイル)を使用して、デプロイ時にシンプル主キーを指定することもできます。

注釈を使用してシンプル主キーを構成するには、次のようにします。

  1. JPAエンティティ実装で、例28-11に示すように、@Id注釈を使用して主キー・フィールドに注釈を付けます。

    例28-11 注釈を使用した主キーの構成

    import javax.ejb.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Column;
    
    @Entity
    @Table(name = "EMP")
    public class Employee implements java.io.Serializable {
    private int empNo;
    private String eName;
    private String birthday;
    private Address address;
    private int version;
    
    public Employee() {
    {
    
    @Id
    @Column(name="EMPNO")
    public int getEmpNo() {
    return empNo;
    }
    ...
    }
    
  2. アプリケーションをパッケージ化し、デプロイします。

マッピング・ディスクリプタ(orm.xml)を使用してエンティティのマッピングを構成する手順は次のとおりです。

永続性ユニットに対してマッピング・ファイル(orm.xml)を作成します。

  1. 「概要」エディタでpersistence.xmlファイルを開きます。

  2. 「一般」タブを選択し、「JPAマッピング・ディスクリプタ」セクションで、「新規のJPAマッピング・ディスクリプタの作成」をクリックします。

  3. 「概要」エディタでorm.xmlファイルを開きます。

  4. 目的のエンティティを追加するには、「一般」タブを選択し、さらに「マップされたクラス」を選択し、「エンティティ」を選択した後で[+]ボタンをクリックします。

    orm.xmlファイルが作成され、1つのエンティティに対してエントリが追加されます。そのエンティティにマッピングを追加する際、注釈またはXML(または、その両方)を使用してマッピングを保存するよう要求されます。

orm.xmlファイルでのIDマッピングの構成

  1. 「概要」エディタで、マッピング・ディスクリプタ(orm.xml)を使用してエンティティ・マッピングを構成する手順に関する項で作成したorm.xmlをダブルクリックします。

  2. 「構造」ペインで、作成したエンティティが表示されるまでペインを拡大します。その後で、目的の「ID」フィールドを右クリックして「マップ」→「ID」を選択します。要求されたら、XMLを選択してorm.xmlファイル内にメタデータを永続させます。これは、例28-12に示すように表示されます。

    例28-12 マッピングXMLを使用した主キーの構成

    <?xml version="1.0" encoding="windows-1252" ?>
    <entity-mappings xmlns="<a target="_blank" href="http://www.eclipse.org/eclipselink/xsds/persistence/orm"">http://www.eclipse.org/eclipselink/xsds/persistence/orm"</a>
                     xmlns:xsi="<a target="_blank" href="http://www.w3.org/2001/XMLSchema-instance"">http://www.w3.org/2001/XMLSchema-instance"</a>
                     xsi:schemaLocation="<a target="_blank" href="http://www.eclipse.org/eclipselink/xsds/persistence/orm">http://www.eclipse.org/eclipselink/xsds/persistence/orm</a> <a target="_blank"                  href="http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_4.xsd"">http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_4.xsd"</a>
                     version="2.4">
      <entity class="model1.Departments">
        <attributes>
          <id name="departmentId"/>
        </attributes>
      </entity>
    </entity-mappings>
    

28.8 セッションBeanでのビジネス・プロセスの実装

セッションBeanは、アプリケーション・サーバー内の単一クライアントを表します。サーバー上でデプロイされたアプリケーションにアクセスするために、クライアントはセッションBeanメソッドを呼び出します。セッションBeanは、サーバー内でビジネス・タスクを実行することによってクライアントに複雑な処理が及ばないようにしながら、クライアントのために処理を実行します。セッションBeanは、インタラクティブ・セッションと類似しています。インタラクティブ・セッションに関わることができるのは1人のユーザーのみであるのと同じように、セッションBeanは共有されず、1つのクライアントのみが関わります。インタラクティブ・セッションの場合と同様、セッションBeanはデータをデータベースに保存しないため、永続的ではありません。クライアントが終了すると、セッションBeanは終了したように見え、クライアントとは関係なくなります。

JDeveloperの「セッションBean」ウィザードを使用して、セッションBeanおよびセッションBeanファサードを作成します。詳細は、第28.8.2項「セッションBeanの作成方法」を参照してください。

セッションBeanには、次のように3種類あります。

  • ステートフル。ステートフル・セッションBeanは、クライアントのかわりに対話状態を維持します。対話状態は、セッションBeanフィールド値とセッションBeanフィールドから到達可能なすべてのオブジェクトとして定義されます。ステートフル・セッションBeanは、永続的なデータ・ストアのデータを直接表すものではなく、クライアントのかわりにデータにアクセスしてデータを更新します。通常、ステートフル・セッションBeanの存続期間はクライアントの存続期間と同じです。

  • ステートレス。ステートレス・セッションBeanは厳密には、サーバー側の動作を提供することを目的として設計されています。これは、ユーザー固有のデータを含まないため、無名です。EJBアーキテクチャは、単一のステートレス・セッションBeanが多くのクライアントのニーズに応じて処理を実行する手段を提供します。クライアントによって呼び出されたメソッドに応じた処理にかかわらない場合、ステートレス・セッションBeanインスタンスはすべて同等です。ステートレスという用語は、特定のクライアントに関するステート情報を持たないことを意味します。ただし、ステートレス・セッションBeanは、オープン・データベース接続など、クライアント固有ではないステートを持つ場合があります。

  • シングルトン。シングルトン・セッションBeanはステートレス・セッションBeanと同様に機能しますが、一連のステートレス・セッションBeanの中で任意のものがクライアント・リクエストに応答できるのとは対照的に、アプリケーションごとに存在するシングルトン・セッションBeanのインスタンスは1つだけである点が異なります。ステートレス・セッションBeanと同様、シングルトン・セッションBeanはWebサービス・エンドポイントを実装できます。シングルトンを使用すると、エンタープライズBeanコンポーネントの複数のインスタンス間で、またはアプリケーション内の複数のエンタープライズBeanコンポーネント間で容易に状態を共有することができます。シングルトン・セッションBeanはクライアントの起動間で状態を維持しますが、サーバーのクラッシュまたはシャットダウン時でも状態を維持するように求められていません。

28.8.1 セッション・ファサードの使用

JDeveloperでは、「セッションBean作成」ウィザードを介してセッションBeanを作成する場合は常に、セッション・ファサード・メソッドの自動生成を選択できます。これにより、ビジネス・ワークフローのセッション・ファサードとして機能するセッションBeanが作成されます。詳細は、第28.8.2項「セッションBeanの作成方法」を参照してください。

セッション・ファサードはセッションBeanとして実装されます。セッションBeanファサードは、アプリケーションのビジネス・サービスに対して単一のインタフェースを提供することにより、ワークフローに参加するビジネス・オブジェクト間の複雑な相互作用をカプセル化します。セッション・ファサードは、多数のビジネス・オブジェクト間の関連を管理し、クライアントに対してより高度な抽象化を提供します。

セッション・ファサードにはステートフル、ステートレス、またはシングルトンのいずれでも使用できます。これは、ウィザードでセッション・ファサードを作成する際に定義します。

セッション・ファサードの詳細は、Oracle Technology Network (http://www.oracle.com/technetwork/java/sessionfacade-141285.html)を参照してください。

ウィザードを使用して、セッションBeanの作成時にセッション・ファサードを自動的に実装して、実装するメソッドを選択します。EJBエンティティを作成すると、同じプロジェクト内で作成するセッションBeanは、公開するエンティティおよびメソッドを認識します。

28.8.2 セッションBeanの作成方法

セッションBeanウィザードを使用して、新規のセッションBeanまたはセッション・ファサードBeanを作成します。また、モデリング・ツールを使用してセッションBeanを作成することもできます。

ウィザードを使用してセッションBeanまたはセッション・ファサードを作成するには、次のようにします。

  1. メイン・メニューから「ファイル」→「新規」の順に選択します。

  2. 「新規ギャラリ」で、「ビジネス層」を開いて「EJB」を選択し、さらに「セッションBean」を選択して、「OK」をクリックします。

    ヒント: よく使用される選択項目は、容易にアクセスできるように「ファイル」メニューに保存されます。


    注意:

    セッション・ファサードBeanを生成するには、永続性ユニットがすでに作成されている必要があります。永続性ユニットを生成するには同じステップに従いますが、「セッションBean」ではなく「JPA永続性ユニット」を選択します。

  3. Beanをセッション・ファサードにするには、「EJBの名前とオプション」ページで「セッション・ファサード・メソッドの生成」を選択します。

    詳細は、随時[F1]を押すか、ウィザード内で「ヘルプ」をクリックしてください。

  4. 「セッションBean作成」ウィザードで、その他の手順をすべて実行します。

セッションBeanファサード・メソッドを追加または削除するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、編集するセッションBeanを選択します。

  2. 右クリックして「セッション・ファサードの編集」を選択します。

  3. 「セッション・ファサード・オプションの指定」ダイアログで、リスト上のメソッドを選択してメソッドがファサードを介して公開されるようにするか、メソッドの選択を解除してメソッドが公開されないようにします。

セッション・ファサードの詳細は、コアJ2EEパターン - セッション・ファサード(http://www.oracle.com/technetwork/java/sessionfacade-141285.html)を参照してください。

セッションBeanとエンティティ間のローカル参照を作成して、セッション・ファサードを手動で作成することもできます。

ローカル参照を作成するには、次のようにします。

  1. まだ作成していない場合は、セッションBeanを作成します。

  2. Bean間にローカル参照を作成します。

    • Beanクラスの場合: EJB 3xを使用している場合は、Beanクラスに注釈を付けて参照を作成します。

    • EJBモジュール・エディタを使用する場合: EJB 2.1 (および以前のバージョン)を使用している場合は、「アプリケーション」ウィンドウでEJBノードを選択し、「構造」ペインで「メソッド」をダブルクリックし、「EJBモジュール・エディタ」を開きます。「EJBローカル参照」を選択します。

EJBダイアグラムでセッションBeanを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウから、EJBダイアグラムを開きます。

    EJBダイアグラムを使用していない場合は、メイン・メニューから「ファイル」→「新規」を選択します。「新規ギャラリ」で、「ビジネス層」を開いて「EJBダイアグラム」を選択し、「OK」をクリックします。

  2. 「コンポーネント」ウィンドウで、「セッションBean」をクリックします。

    「コンポーネント」ウィンドウが表示されない場合は、「表示」メニューから「コンポーネント」を選択します。

  3. EJBダイアグラムの中をクリックします(ドラッグ・アンド・ドロップしないでください)。

28.8.3 EJBモジュールでのセッションBeanの作成方法

新規EJBモジュールと既存のEJBモジュールの両方でセッションBeanを作成できます。

既存のEJBモジュールにセッションBeanを作成する手順は次のとおりです。

  1. 「アプリケーション」ウィンドウで、EJBプロジェクトを右クリックして、「新規」→「セッションBean」を選択します。

    または、プロジェクトを選択して、メイン・メニューで「ファイル」→「新規」→「ギャラリから」を選択します。「新規ギャラリ」で、「ビジネス層」を開いて「EJB」を選択し、さらに「セッションBean」を選択して、「OK」をクリックします。

  2. 「セッションBean作成」ウィザードの手順を実行します。

新規のEJBモジュールにセッションBeanを作成する手順は次のとおりです。

  1. 「アプリケーション」ウィンドウで、「ファイル」→「新規」→「プロジェクト」を選択します。

  2. 「新規ギャラリ」で、作成するプロジェクトのタイプを選択し、「OK」をクリックします。

  3. 「アプリケーション」ウィンドウで、新規プロジェクトを右クリックして、「新規」→「ギャラリから」を選択します。「新規ギャラリ」で、「ビジネス層」のカテゴリを開いて「EJB」を選択し、さらに「セッションBean」を選択して、「OK」をクリックします。

    または、プロジェクトを選択して、「新規」→「セッションBean」を選択します。

  4. 「セッションBean作成」ウィザードの手順を実行します。

28.8.4 EJBモジュールでのメッセージドリブンBeanの作成方法

新規モジュールと既存のモジュールの両方でEJBを作成できます。

既存のEJBモジュールにメッセージドリブンBeanを作成する手順は次のとおりです。

  1. 「アプリケーション」ウィンドウで、EJBプロジェクトを右クリックして、「新規」→「メッセージドリブンBean」を選択します。

    または、プロジェクトを選択して、メイン・メニューで「ファイル」→「新規」→「ギャラリから」を選択します。「新規ギャラリ」で、「ビジネス層」を開いて「EJB」を選択し、さらに「メッセージドリブンBean」を選択して、「OK」をクリックします。

  2. 「メッセージドリブンBean作成」ウィザードの手順を実行します。

新規のEJBモジュールにメッセージドリブンBeanを作成する手順は次のとおりです。

  1. 「アプリケーション」ウィンドウで、「ファイル」→「新規」→「プロジェクト」を選択します。

  2. 「新規ギャラリ」で、作成するプロジェクトのタイプを選択し、「OK」をクリックします。

  3. 「アプリケーション」ウィンドウで、新規プロジェクトを右クリックして、「新規」→「ギャラリから」を選択します。「新規ギャラリ」で、「ビジネス層」のカテゴリを開いて「EJB」を選択し、さらに「メッセージドリブンBean」を選択して、「OK」をクリックします。

    または、プロジェクトを選択して、「新規」→「メッセージドリブンBean」を選択します。

  4. 「メッセージドリブンBean作成」ウィザードの手順を実行します。

28.8.5 EJBメソッドの追加、削除および編集方法

プロジェクトにEJBが追加された後、そこに含まれるメソッドを追加、削除または編集できます。次で説明するようにメソッドを追加すると、定義時に変更がリモート・インタフェースとホーム・インタフェースで同期化されます。

メソッドを追加するには:

  1. 「アプリケーション」ウィンドウで、EJBを選択します。

  2. 構造ペインでEJBを右クリックし、「Enterprise Java Bean (EJB)」「新規メソッド」を選択します。

  3. 「Beanメソッドの詳細」ダイアログで、必要に応じて詳細を追加します。

  4. 完了後、「OK」をクリックします。

メソッドを削除するには:

  1. 「アプリケーション」ウィンドウで、EJBを選択します。

  2. 構造ペインで、メソッドをダブルクリックしてソース・ファイル内で検索します。

  3. ソース・ファイルで、メソッドを削除します。

メソッドを編集するには:

  1. 「アプリケーション」ウィンドウで、EJBを選択します。

  2. 構造ペインで、EJBを右クリックし、「Enterprise Java Bean (EJB)」「プロパティ」を選択します。

  3. 「Beanメソッドの詳細」ダイアログで、必要に応じて詳細を編集します。

  4. 完了後、「OK」をクリックします。

28.8.6 EJBへのフィールドの追加方法

EJBダイアグラムまたはEJBモジュール・エディタを介して、EJBにフィールドを追加できます。

  1. 「アプリケーション」ウィンドウで、EJBを選択します。

  2. 構造ペインで、EJBを右クリックし、「Enterprise Java Bean (EJB)」ノード→「新規フィールド」を選択します。

  3. 「フィールド詳細」ダイアログで、必要に応じて詳細を追加します。

  4. 完了後、「OK」をクリックします。

28.8.7 EJBからのフィールドの削除方法

次に示すように、フィールドをEJBから削除できます。

EJBダイアグラム上のフィールドを削除するには、次のようにします。

  1. EJB上のフィールド・コンパートメント(最初のコンパートメント)をクリックします。

  2. フィールドを強調表示して[Del]キーを押します。

「アプリケーション」ウィンドウを使用してフィールドを削除する手順は次のとおりです。

  1. 「アプリケーション」ウィンドウで、EJBを選択します。

  2. 構造ペインで、フィールドをダブルクリックしてソース・ファイル内で検索します。

  3. ソース・ファイルで、フィールドを削除します。

28.8.8 EJB環境エントリを使用したビジネス・ロジックのカスタマイズ

環境エントリは、Beanのビジネス・ロジックをカスタマイズできる名前と値のペアです。環境エントリはエンタープライズBeanのデプロイメント・ディスクリプタに格納されるため、ソース・コードを変更せずにBeanのビジネス・ロジックを変更できます。

たとえば、注文を計算するEJBは、受注数量や特定のステータス(シルバー、ゴールド、プラチナ)に応じて、あるいは販売促進のために、割引きを行うことがあります。Beanのアプリケーションをデプロイする前に、特定の割引率を指定できます。アプリケーションを実行すると、メソッドは環境エントリをコールして割引値を調べます。別のデプロイメントについてその割引率を変更する場合、ソース・コードを変更する必要はなく、デプロイメント・ディスクリプタの環境エントリの値を変更するだけです。

ソース・コードで環境エントリに注釈を付けます。

完全なEJB 3x Java Community Processの仕様およびドキュメントは、http://www.oracle.com/technetwork/java/docs-135218.htmlを参照してください。

28.8.9 クライアントへのデータの公開

クライアントにデータを公開する方法は、アプリケーションの開発方法に応じて異なります。

28.8.10 リソース参照の識別方法

リソース参照は、リソースに対するコンポーネントのコード名を識別するデプロイメント・ディスクリプタ内の要素です。リソース参照は、コネクタおよびデータベース接続を取得するため、ならびにJMS接続ファクトリ、JavaMailセッションおよびURLリンクにアクセスするために使用されます。

EJB 3xリソース参照を追加または変更する手順は次のとおりです。

ソース・コードに移動し、リソース参照に注釈を付けます。

28.8.11 ADFバインディングの主キーの指定方法

特定のADF Faces機能では、主キーを指定する必要があります。たとえば、af:tableSelectManyコンポーネントを使用するADF Faces表がある場合、ソートを実装するために主キーを指定する必要があります。EJB/JPAエンティティを表から(EJB 3xを使用して)作成する場合、デフォルトでは主キーが指定されます。しかし、主キーを指定する必要がある場合は、次を実行します。

属性を主キーとして指定するには、次のようにします。

  1. ADFデータ・コントロールを作成して、エンティティ別にXML定義を作成します。詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のADFデータ・コントロールの使用に関する項を参照してください。

  2. 「アプリケーション」ウィンドウで、EJBエンティティのXMLファイルを選択します。

  3. 「構造」ウィンドウでエンティティ属性を選択し、さらに「表示」メニューから「プロパティ」を選択します。

  4. 「プロパティ」ウィンドウで主キーとして必要な属性を検索し、「主キー」の値を「True」に設定します。

28.8.12 EJBのADFデータ・コントロールの使用方法

JDeveloperでは、ADF Fusion Webアプリケーションを構築する際にデータ・コントロール・コンポーネントの完全セットが自動的に提供されます。Java EEアプリケーションまたはEJBプロジェクト(あるいはその両方)を構築する場合、個別セッションBeanでADFデータ・コントロールを割り当てます。これにより、Beanと同じ名前のデータ・コントロール・ファイルが追加されます。

詳細は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のADFデータ・コントロールの使用に関する項を参照してください。

28.9 ダイアグラムでのEJB/JPAコンポーネントのモデル化

ダイアグラムでのEJBおよびJPAコンポーネントのモデル化の詳細は、第5.11項「EJBダイアグラムによるモデリング」を参照してください。

28.10 Webアプリケーションの一部としてのEJBのデプロイ

EJB 3.1では、エンタープライズBeanクラスはejb-jarファイルにパッケージ化する必要があるという制約が解除されています。したがって、EJBクラスは、Webアプリケーション・クラスに適用されるものと同じパッケージ化ガイドラインを使用して、Webアプリケーション・アーカイブ(WAR)の中に直接パッケージ化できます。EJBクラスをWEB-INF/classesディレクトリに置くか、WEB-INF/libディレクトリ内のJARファイルに入れるだけです。オプションとして、EJBデプロイメント・ディスクリプタを使用している場合は、WEB-INF/ejb-jar.xmlとしてパッケージ化することもできます。

28.11 EJBモジュールおよびJPA永続性ユニットのデプロイ

EJBモジュールは、1つ以上のEJB、永続性ユニットおよびオプションのEJBデプロイメント・ディスクリプタで構成されるソフトウェア・ユニットです。1つのJDeveloperプロジェクトに含まれるのは、1つのEJBモジュールのみです。デプロイ時には、モジュールはejb.jarファイルとしてパッケージ化されます。

28.11.1 JPAエンティティBeanのデプロイ

エンティティBeanは以前、セッションBeanおよびメッセージドリブンBeanとともにEJB JARファイルに1回だけパッケージ化されていました。しかし、JPAエンティティおよび永続性ユニットのテクノロジにより、これらはデプロイ時に独自のJARファイルpersistenceunit.jarにパッケージ化されます。

この方法により、エンティティBean (JPAエンティティ)は、persistence.xmlファイルが含まれているJPA永続性アーカイブJARに個別に格納されます。JPA永続性ユニットはEJBモジュール・パッケージの一部である必要はなく、the ejb.jarファイル内にバンドルできます。

28.11.2 EJBモジュールについて

1つのJDeveloperプロジェクトに含まれるのは、1つのEJBモジュールのみです。プロジェクト内で最初のセッションBeanまたはメッセージドリブンBeanを作成する場合、モジュールが存在しなければ、モジュールは自動的に作成されます。新規EJBモジュールのEJBバージョンと永続性マネージャは選択できます。

プロジェクトをデプロイする場合、セッションBeanおよびメッセージドリブンBeanとデプロイメント・ディスクリプタの集合を、アプリケーション・サーバーへのデプロイメントまたはアーカイブ・ファイルとしてのデプロイメントの準備が整っているEJB JARファイル(.jarファイル)に変換します。永続性ユニットを独自のJARファイルに限定することにより、永続性ユニットを他のアプリケーションで簡単に再利用できるようになります。詳細は、第21.1項「アプリケーションのデプロイについて」を参照してください。

28.11.3 JPA永続性ユニットについて

JPA永続性ユニットは、persistence.xmlファイル、1つ以上のオプションのorm.xmlファイル、および永続性ユニットに属する管理対象エンティティ・クラスで構成されています。永続性ユニットは、エンティティ・マネージャ、データソース、永続管理対象クラスおよびマッピング・メタデータの論理グループです。永続性ユニットは、エンティティ・マネージャ・プロバイダ、構成プロパティおよび永続管理対象クラスなどの詳細を論理的にグループ化することにより、エンティティ・マネージャの構成を定義します。

各永続性ユニットには名前を指定する必要があります。特定のEJB-JAR、WAR、EARまたはアプリケーション・クライアントJAR内に存在できるのは特定の名前を持つ1つの永続性ユニットのみです。永続性ユニットを独自の永続性アーカイブにパッケージ化し、Java EEモジュールによるアクセスが必要な任意の対象にこのアーカイブを含めることができます。

persistence.xmlファイルにはセクションまたはグループが含まれます。これらのグループは、エンティティおよびエンティティに関連するランタイム・データに対応します。エンティティ・ウィザードを使用して新規エンティティを作成するときに、プロジェクト内に既存の永続性ユニットがある場合、エンティティはpersistence.xml内の独自のセクションに挿入されます。既存の永続性ユニットがない場合は、エンティティ定義のために含まれるセクションとともに永続性ユニットが作成されます。

META-INFディレクトリにpersistence.xmlファイルが含まれるJARファイルまたはディレクトリは、永続性ユニットのルートと呼ばれます。エンティティを使用するEJB 3xアプリケーションには、明示的に、またはJDeveloperのデフォルトの永続性ユニットを使用して少なくとも1つの永続性ユニットのルートを定義する必要があります。永続性ユニットをデプロイすると、persistenceunit.jarと呼ばれるJARファイルが作成されます。詳細は、第21.1項「アプリケーションのデプロイについて」を参照してください。

28.11.4 JPA永続性ユニットの作成方法

「永続性ユニット」ウィザードを使用してエンティティの永続性ユニットを作成できます。また、JPAエンティティを作成する場合、デフォルトの永続性ユニットがまだない場合はこれが作成されます。

JPA永続性ユニットを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウでプロジェクトを選択して、「ファイル」メニューから「新規」→「ギャラリから」を選択します。

  2. 「新規ギャラリ」から「ビジネス層」を開いて「EJB」を選択し、さらに「JPA永続性ユニット」を選択して、「OK」をクリックします。

  3. 「新規の永続性ユニット」ウィザードのステップを完了します。

28.11.5 モジュール内のEJBの削除方法

EJBモジュールからEJBを削除するには、「アプリケーション」ウィンドウでEJBを選択して、「削除」を押します。

28.11.6 JDeveloperへのEJBのインポート方法

JARファイルまたはデプロイメント・ディスクリプタから既存のEJBをインポートできます。

EJBモジュール、またはEJBモジュール内のEJBのサブセットをプロジェクトにインポートするには、次のようにします。

  1. 「ファイル」メニューから「インポート」を選択します。

  2. 「インポート」ダイアログで「EJB JARファイル(.jar)」を選択します。

  3. 「インポート」ウィザードの手順を実行します。

EJBデプロイメント・ディスクリプタ・ファイル(ejb-jar.xml)をインポートするには、次のようにします。

  1. 「ファイル」メニューから「インポート」を選択します。

  2. 「インポート」ダイアログで「EJBデプロイメント・ディスクリプタ・ファイル(ejb-jar.xml)」を選択します。

  3. 「インポート」ウィザードの手順を実行します。


    注意:

    このウィザードを使用してデプロイメント・ディスクリプタをインポートした後、同じウィザードで他のファイルをインポートすると、最後に使用したディスクリプタ・ファイル、JARファイルおよびIDE設定ファイル内のディスクリプタ・ソース・ディレクトリがキャッシュされるので便利です。これにより、たとえば、EJBモジュールを複数のモジュールに分割する、同じディレクトリ内にある複数のJARファイルをインポートする、などのタスクが容易になります。

WebLogicデプロイメント・ディスクリプタ・ファイル(weblogic-ejb-jar.xml)をインポートするには、次のようにします。

  1. 「ファイル」メニューから「インポート」を選択します。

  2. 「インポート」ダイアログで「EJBデプロイメント・ディスクリプタ・ファイル(ejb-jar.xml)」を選択します。

  3. 「インポート」ウィザードの手順を実行します。

    既存のモジュールに同じ名前のEJBがすでに存在している場合、競合を避けるため、そのEJBはインポートされません。

28.12 EJB/JPAコンポーネントの実行およびテスト

EJBをテストするには、EJBインスタンスを作成または検索し、そのリモート・インタフェース・メソッドをコールできるクライアント・プログラムを実行する必要があります。JDeveloperには、迅速にクライアントを作成できるサンプル・クライアント・ユーティリティが用意されています。EJBの実行およびテストには、統合サーバーまたはリモート・サーバーを使用しますが、どちらの場合にもサンプル・クライアント・ユーティリティを使用してクライアントを作成できます。

28.12.1 統合サーバーを使用したEJB/JPAコンポーネントのテスト方法

統合Oracle WebLogic ServerはJDeveloper内で動作します。このサーバーを使用すると、EJBの迅速かつ簡単な実行およびテストが可能であり、何の変更も加えずにそのEJBをデプロイできます。このサーバーを使用する場合、デプロイメント・プロファイルは不要で、初期化の必要もありません。

統合Oracle WebLogic Serverでサンプル・セッションBeanクライアントを実行する手順は次のとおりです。

  1. 「アプリケーション」ウィンドウでセッションBeanを右クリックして、「実行」を選択します。

    「メッセージ」ペインではOracle WebLogic Serverは起動しています。

  2. セッションBeanを右クリックして、コンテキスト・メニューから「セッションBeanクライアント」を選択します。

  3. サンプル・クライアントの作成ダイアログで、「サーブレット・クライアント」Javaクライアントのどちらを作成するかを指定します。

  4. デフォルトで、統合Oracle WebLogic Serverに対してクライアントを作成するオプションが選択されているので、「OK」をクリックします。

    クライアントが作成され、コード・エディタで開かれます。

    BeanがJPAエンティティに対するファサードとして機能する場合、問合せメソッドをインスタンス化するためのコードが生成されます。Beanに対してメソッドを公開した場合、生成されたクライアントには、非コメント化して呼び出すことができるメソッドが含まれます。

  5. Beanが「アプリケーション」ウィンドウから正常に起動されたら、サンプル・クライアントを右クリックして「実行」を選択します。

    Javaクライアントの場合、「メッセージ」ペインに実行中の出力ログが表示されます。サーブレット・クライアントの場合、結果は整形式の表でブラウザに表示されます。

統合Oracle WebLogic ServerでサンプルMDBクライアントを実行する手順は次のとおりです。

統合Oracle WebLogic ServerでサンプルMDBクライアントを正常に実行するには、まず、対応するJMSキュー・リソースをWebLogic Serverドメインに作成する必要があります。

  1. 『Oracle WebLogic Server JMSリソースの管理』にあるJMSのキューおよびトピックの宛先構成に関する項の指示に従ってください。

  2. JMSモジュール・リソースを作成する場合は、次のガイドラインを使用してください。

    1. 新規のキュー・リソース(たとえば、"DefaultQueue")を使用して、新規のテストJMSモジュール(たとえば、"TestJmsModule")を作成します。

    2. 生成したMDBの「マップされた名前」に一致するJNDI名(weblogic.wsee.DefaultQueueなど)を使用します。

    3. デフォルトのサブデプロイメント・リソース(たとえば、"DefaultQueue")を追加し、それを、ドメインのDefaultServerインスタンスに関連付けられているJMSサーバーのターゲットとします。

  3. 「統合Oracle WebLogic Serverでサンプル・セッションBeanを実行する手順」に示した手順を実行します。ただし、「アプリケーション」ウィンドウで、MDBを選択してサンプル・クライアントを作成および実行します。

28.12.2 リモート・サーバーを使用したEJB/JPAコンポーネントのテスト方法

リモート・サーバー上でEJBをテストするには、EJBをデプロイしてからサンプル・クライアントを作成する必要があります。最初にデプロイを行うと、デプロイされたアプリケーションがフレームワークによって取得され、それがクライアントの選択リストに移入されます。


注意:

同じモジュールで異なるEJBバージョンを組み合せることはできません。

リモート・サーバーを使用してサンプル・クライアントを実行するには、次のようにします。

  1. 必要に応じて、実行しているアプリケーション・サーバーに対する接続を作成します。手順の詳細は、第21.3.1項「ターゲット・アプリケーション・サーバーへの接続の作成方法」を参照してください。

  2. プロジェクトレベルのEJB JARデプロイメント・プロファイルを作成します。

    1. 「アプリケーション」ウィンドウで、プロジェクトのノードを右クリックし、「デプロイ」→「新規デプロイメント・プロファイル」を選択します。

    2. 「デプロイメント・プロファイルの作成」ダイアログで、EJB JARファイルのプロファイル・タイプを選択し、そのプロファイルの名前を入力します。「OK」をクリックすると、「EJB JARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。デフォルトを受け入れて「OK」をクリックします。

  3. アプリケーションレベルのEARタイプのデプロイメント・プロファイルを作成します。

    1. 「アプリケーション」→「デプロイ」→「新規デプロイメント・プロファイル」の順に選択します。

    2. 「デプロイメント・プロファイルの作成」ダイアログで、EARファイルのプロファイル・タイプを選択し、そのプロファイルの名前を入力します。「OK」をクリックすると、「EARデプロイメント・プロファイルのプロパティの編集」ダイアログが表示されます。

  4. 新しいEJB JARプロファイルをEARプロファイル・ファイルに追加します。

    1. 「EARデプロイメント・プロファイルのプロパティの編集」ダイアログのナビゲーション・ペインで、「アプリケーション・アセンブリ」を選択します。

    2. 「Java EEモジュール」ツリーを展開し、手順2で作成したEJB JARプロファイルを選択して「OK」をクリックします。

  5. アプリケーション・サーバー接続にアプリケーションをデプロイします。「アプリケーション」→「「application-deployment-profileのデプロイ」の順に選択します。

  6. 「デプロイ」ダイアログ・ボックスで「アプリケーション・サーバーへのデプロイ」を選択し、「次へ」をクリックします。

  7. 「サーバーの選択」ページでアプリケーション・サーバー接続を選択し、「終了」をクリックします。「デプロイメント」ログ・ウィンドウで詳細を追跡できます。

  8. 「アプリケーション」ウィンドウでセッションBeanを右クリックして、「セッションBeanクライアント」を選択します。

  9. サンプル・クライアントの作成ダイアログで、「サーブレット・クライアント」Javaクライアントのどちらを作成するかを指定します。

  10. デフォルトで、統合Oracle WebLogic Serverに対してクライアントを作成するオプションが選択されているので、「OK」をクリックします。

    クライアントが作成され、コード・エディタで開かれます。

  11. 「アプリケーション」ウィンドウで新規クライアントを右クリックして、「実行」を選択します。

    Javaクライアントの場合、「メッセージ」ペインに実行中の出力ログが表示されます。サーブレット・クライアントの場合、結果は整形式の表でブラウザに表示されます。

28.12.3 JUnitを使用したEJBユニットのテスト方法

JDeveloperでは、EJBに対するJUnit回帰テストがサポートされています。JUnitは、JDeveloperのオプション機能として用意されているオープン・ソースのJava回帰テスト用のフレームワークです。この機能を使用するには、JUnit拡張機能をインストールする必要があります。

JUnitを使用して、コードを検証するテストを記述および実行します。JUnit拡張機能をインストールした後、シンプル・ウィザードを使用してセッションBeanまたはJavaクラス・ファイルを選択し、これらのファイル内でテストするメソッドを選択し、JUnitテストを開始できます。

EJBに対してJUnitテストを実行するには、次のようにします。

  1. JDeveloperの「ヘルプ」メニューからJUnit拡張機能をインストールします。詳細は、第10.3.1項「JUnitのインストール方法」を参照してください。

  2. 「アプリケーション」ウィンドウでEJBセッションBeanまたは通常のJavaクラス(POJO)を右クリックして(または、ウィザードの中から移動することもできます)、「新規」→「ギャラリから」を選択します。

  3. 「新規ギャラリ」から「ビジネス層」および「EJB」を開き、「EJB JUnit TestCase」を選択して、「OK」をクリックします。

  4. JUnitウィザードを起動します。

  5. ウィザードのステップを完了します。