この章では、JDeveloperツールを使用して、Enterprise JavaBeans (EJB) 3.0およびJava永続性API (JPA)コンポーネントによるJ2EEエンタープライズ・アプリケーションのビジネス層を構築する方法について説明します。
この章では、次の項目について説明します。
JDeveloperには、EJBプロジェクト、エンティティ、永続性ユニット、セッションBeanおよびメッセージドリブンBeanを作成するための段階的ウィザードが用意されています。オンライン・データベース定義またはオフライン・データベース定義およびアプリケーション・サーバーのデータソース接続からエンティティを構築できます。また、JPAおよびTopLinkテクノロジとシームレスに統合できるため、完全な永続性パッケージを実現することもできます。
JDeveloperは、EJB 3.0およびバージョン1.0から2.1をサポートしています。現在のJDeveloper文書(ユーザー・ガイドのこの章および埋め込まれているオンライン・ヘルプを含む)は、EJB 3.0開発タスクに焦点を当てています。
EJB 2.1以前の使用方法の詳細は、JDeveloper文書の前のバージョンを参照してください。この文書のこれらのバージョンの詳細は、http://www.oracle.com/webapps/online-help/jdeveloper/10.1.3
を参照し、トピック「Enterprise JavaBeanコンポーネントの開発」を検索してここにナビゲートしてください。EJBアプリケーション開発インタフェースはバージョンごとに異なる可能性があり、一部の履歴ヘルプの内容は現在のバージョンでは古い場合があります。
すべてのバージョンに関する完全なEJB Java Community Processの仕様および文書は、Oracle Technology Network (http://www.oracle.com/technetwork/java/docs-135218.html
)を参照してください。
注意: EJB 3.0を使用している場合、一部のデプロイ・ファイルのかわりに、注釈を使用できます。デプロイメント・ディスクリプタを含めて、注釈をオーバーライドするか、または注釈でサポートされていないオプションを指定します。 |
サポートされる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でサポートされます。コールバック・メソッドは、注釈またはデプロイメント・ディスクリプタを使用して指定されます。
JDeveloperには、エンタープライズ・アプリケーションのEJBビジネス・レイヤーの設定するための完全機能セットが含まれます。
段階的ウィザードを使用してEJB Webアプリケーション用のフレームワークを作成し、エンタープライズ・アプリケーションのモデル・レイヤーを設定することから開始できます。次に、ウィザードを使用して、データベース表に相当するエンティティを作成できます。さらに、ウィザードを使用して、セッションBeanおよびセッション・ファサードを作成し、永続性ユニットを構築できます。Oracle ADFには、データ・コントロールを可能にするコンポーネントが用意されています。準備が整ったら、JDeveloper統合サーバー機能を使用してこれをテストできます。
JDeveloperには、次の項目で説明するように、EJBアプリケーションを開発するためのツールが含まれます。
エンティティ・ウィザードを使用して、エンティティを作成、またはオンライン、オフラインまたはアプリケーション・サーバー・データソース接続を使用して表からエンティティを作成します。エンティティBean (表ベース)ウィザードを使用して、データベース表からエンティティをリバース・エンジニアリングします。エンティティ・ウィザードでは、永続性ユニットおよびデータベース接続を選択または追加したり、エミュレートするデータベースを選択できます。また、自分のエンティティ用のデータベース表を選択することもできます。詳細は、第12.6.2項「JPAエンティティの作成方法」を参照してください。
エンティティは、既存の表から作成するか、またはJavaソース・エディタを使用して手動で作成できます。既存の表からエンティティを作成する場合、マッピングは自動的に行われます。エンティティを手動で作成すると、より自由にマッピングできますが、手動でコーディングする必要があります。ウィザードまたはEJBダイアグラムを使用して、エンティティを作成できます。
セッションBeanを使用して、セッション・ファサード・デザイン・パターンを実装できます。セッション・ファサードはデータを集約して表示し、ビジネス・ロジックに場所を提供し、コンテナを介してトランザクション・コンテキストを設定します。詳細は、第12.7項「セッションBeanでのビジネス・プロセスの実装」および第12.7.1項「セッション・ファサードの使用」を参照してください。
ウィザードを使用してセッションBeanを作成する場合、同じプロジェクト内のすべてのエンティティのセッション・ファサード・メソッド生成を選択できます。生成するコア・トランザクション・メソッド、get()
アクセッサとset()
アクセッサ、およびエンティティ上のファインダ・メソッドを選択できます。新しいエンティティ、またはエンティティ上の新しいメソッドを作成する場合、既存のセッション・ファサードを更新するには、ナビゲータでそのセッション・ファサードを右クリックし、「セッション・ファサードの編集」を選択します。
JDeveloperには、デプロイしたEJBのコンテナとしてOracle WebLogic Serverが用意されています。デフォルトでは、JDeveloperサーバー固有のデプロイメント・プロファイルが生成されます。WebLogic固有のデプロイメント・プロファイルを作成することもできます。詳細は、第12.9項「EJBモジュールおよびJPA永続性ユニットのデプロイ」を参照してください。
JDeveloperでは、リモート・サーバーで使用するサンプル・クライアントも作成できます。サンプル・クライアントの生成方法は、リモート接続の詳細を指定する以外は、ローカル・クライアントの場合と同様です。詳細は、第12.10.2項「リモート・サーバーを使用したEJB/JPAコンポーネントのテスト方法」を参照してください。
ADFには、エンティティのデータ・コントロールを可能にするコンポーネントが用意されています。エンティティのデータ・コントロールを手動で追加すると、Java EEアプリケーションによって選択的コンポーネントが統合されます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド』のJava EE WebアプリケーションでのADFモデル・データ・バインディングの使用に関する項を参照してください。
WebベースのEJB 3.0アプリケーションのためのモデル・ビジネス・サービス・レイヤーを作成します。
Webベースのアプリケーションを作成するには、次のようにします。
「ファイル」→「新規」→一般アプリケーションを選択します。
使用可能なアプリケーションのリストが表示されます。EJBプロジェクトの場合、カスタム・アプリケーションまたはJava EEアプリケーションを構築することを選択できます。Java EEアプリケーションにより、EJB/JPAのデータバインドされたWebアプリケーションが作成されます。
JPAエンティティを作成するには、次のようにします。
アプリケーション・ナビゲータで、「モデル」を選択します。
「ファイル」→「新規」→「ビジネス層」→「EJB」→「エンティティ」または「表からのエンティティ」を選択します。
「永続性ユニット」ページにアクセスしたら、「次へ」をクリックしてデフォルトの永続性ユニットpersistence.xml
を自動的に作成するか、「新規」をクリックして既存のMETA-INF/persistence.xml
ファイル内に新規永続性グループを作成します。
ウィザードの残りのステップに従ってJPAエンティティを作成します。
セッション・ファサードを実装するには、次のようにします。
アプリケーション・ナビゲータで、「モデル」を選択します。
「ファイル」→「新規」→「ビジネス層」→「EJB」→「セッションBean」を選択します。
ウィザードのステップに従います。
「EJBの名前とオプション」ページにアクセスしたら、「セッション・ファサード・メソッドの生成」を選択します。これにより、セッション・ファサード・メソッドがセッションBeanに自動的に追加されます。セッションBeanを右クリックして、「セッション・ファサードの編集」を選択することで、プロジェクト内のすべてのエンティティのセッション・ファサード・メソッドを作成および編集できます。JDeveloperでは、プロジェクト内の新しいエンティティおよびエンティティ上の新しいメソッドが自動的に認識されます。
データ・コントロールを使用してビジネス・サービスのモデル・プロジェクトを登録するには、次のようにします。
ナビゲータでセッションBeanを右クリックし、「データ・コントロールの作成」を選択します。
これにより、セッションBeanを処理するようにデータ・コントロールを初期化するための情報が含まれるDataControls.dcx
と呼ばれるファイルが作成されます。
アプリケーションを実行およびテストするには、次のようにします。
WebベースのEJBアプリケーション用のモデル・レイヤーの基本フレームワークを作成しました。このフレームワークを使用して、アプリケーションを構築する過程でアプリケーションをテストします。詳細は、第12.10項「EJB/JPAコンポーネントの実行およびテスト」を参照してください。
アプリケーションをデプロイするには、次のようにします。
統合サーバーはJDeveloper内で動作します。このサーバーを使用すると、EJBの実行およびテストが可能であり、何の変更も加えずにそのEJBをデプロイできます。このサーバーを使用する場合、デプロイメント・プロファイルは不要で、初期化の必要もありません。デプロイメント・ディスクリプタ・ウィザードを使用してデプロイメント・ディスクリプタejb-jar.xml
を作成してから、アプリケーションを使用したデプロイメント用としてEJBモジュールをパッケージ化します。
Java EEデザイン・パターンは、定型的な設計に関する問題を解決するためのベスト・プラクティスをまとめたものです。各パターンは様々な問題に応用できる既成のソリューションであり、成功を収めたJava EE開発者の経験を活用しています。
JDeveloperを使用すると、EJBアプリケーションに次のJava EEデザイン・パターンを実装できます。
MVC: MVCパターンでは、アプリケーションはモデル、ビューおよびコントローラという3つの部分に分割されます。モデルはアプリケーションのビジネス・サービスを表し、ビューはアプリケーションのうちクライアントがアクセスする部分です。コントローラはアプリケーションのフローとアクションを制御し、モデルとビューの間にシームレスな相互作用をもたらします。プロジェクトの開始時にFusion Webアプリケーション(ADF)テンプレートまたはJava EE Webアプリケーション・テンプレートを選択すると、MVCパターンが自動的に実装されます。
セッション・ファサード: セッション・ファサード・パターンには、下位レベルEJB (通常はJPAエンティティ)が含まれており、EJB間の複雑な相互作用が集中化されます。また、アプリケーションのビジネス・サービスに対して単一のインタフェースを提供します。詳細は、第12.7項「セッションBeanでのビジネス・プロセスの実装」を参照してください。
ビジネス委任: ビジネス委任パターンにより、クライアントとビジネス・サービスが切り離され、ビジネス・サービスの基礎となる実装詳細が隠されます。ビジネス委任パターンは、JDeveloperの「データ・コントロール・パレット」に表示されるデータ・コントロールにより実装されます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド』のJava EE WebアプリケーションでのADFモデル・データ・バインディングの使用に関する項を参照してください。
永続層は、データベース内の表を表す永続性データ・オブジェクトがすべて含まれるEJBアプリケーションの一部です。EJB 3.0で導入されたエンティティ・モデルはJava永続性APIで定義されているため、これらのビジネス・コンポーネントはJPAエンティティと呼ばれます。
JPAエンティティは、Oracle TopLinkおよびHibernateとシームレスに動作するよう設計された軽量永続性モデルを採用しています。
JPAエンティティの主な拡張機能は、次のとおりです。
POJOであるJPAエンティティ
O-Rマッピングのメタデータ注釈
継承およびポリモフィズムのサポート
CRUD操作のためのEntityManager APIの簡素化
問合せの拡張機能
JPAエンティティはPOJO (Plain Old Java Objects)であり、コンポーネント・インタフェースは不要です。JPAエンティティは、継承およびポリモフィズムもサポートしています。
例12-1は、単純なJPAエンティティのソース・コードを示しています。
例12-1 単純な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の場合と同様に、抽象クラスではなく具体的なクラスであることに注意してください。
O-Rマッピング注釈を使用すると、O-Rマッピング・メタデータを使用してエンティティを記述できます。その後、このメタデータは、エンティティの永続性および取得を定義するために使用されます。ベンダー固有のディスクリプタでO-R (オブジェクト・リレーショナル)マッピングを定義する必要はなくなります。
前述の例では、@Entity
、@Table
および@Column
注釈を使用して、これがエンティティであることをクラス・レベルで指定するとともに、エンティティの基礎となるデータベース表と列名を指定しています。例12-2に示すように、マッピング注釈を使用して、エンティティ間の関連を定義することもできます。
継承は、様々な使用例で非常に役に立ちます。一般的に使用され、JPAエンティティ用のOracle Application Serverでサポートされる2つのタイプの継承は、次のとおりです。
クラス階層単位の単一表
結合されたサブクラス方針
継承は、注釈を使用して表すことができます。結合されたサブクラス方針を使用するコード例を例12-3に示します。
例12-3 結合されたサブクラス方針
@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 { ... }
javax.persistence.EntityManager
APIは、エンティティ・インスタンスに対するCRUD (Create、Read、UpdateおよびDelete)操作に使用されます。インスタンスを参照して操作するために、コードを記述する必要はなくなります。例12-4のように、セッションBeanにEntityManagerのインスタンスを挿入し、EntityManagerインスタンスでpersist()
またはfind()
メソッドを使用して、エンティティBeanオブジェクトを作成または問い合せることができます。
例12-4 セッション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); } }
問合せはメタデータ内で定義します。ここでは、注釈を使用して、またはデプロイメント・ディスクリプタ内で問合せを指定できます。JPAエンティティは、JPQL (Java永続性問合せ言語)を介してバルク更新および削除操作をサポートします。詳細は、第12.6.7項「EJB/JPA用のJDK 5注釈」を参照してください。
JDeveloperには、JPAエンティティを作成するための簡単なウィザードが2つ用意されています。オンライン・データベースまたはオフライン・データベースからのエンティティの作成、永続性ユニットの追加、継承方針の定義、および使用可能なデータベース・フィールドからの選択が可能です。表からのエンティティ・ウィザードを使用すると、オンライン・データベースまたはエミュレートされたオフライン・データベースや、アプリケーション・サーバー・データソースからエンティティを作成できます。
エンティティを作成、または表からエンティティを作成するには、次のようにします。
「ファイル」メニュー→「新規」→「ビジネス層」→「EJB」→「エンティティ」または「表からのエンティティ」を選択します。
ウィザードのステップに従います。
既存のモジュールにEJBを作成するには、次のようにします。
ナビゲータでEJBモジュールを右クリックし、「新規」→「EJB」→「エンティティ」または「表からのエンティティ」を選択します。
または、「ファイル」メニュー→「新規」→「ビジネス層」→「EJB」→「エンティティ」または「表からのエンティティ」を選択します。
ウィザードのステップに従います。
新規のEJBモジュールにEJBを作成するには、次のようにします。
「ファイル」→「新規」→「一般」→「プロジェクト」を選択します。
作成するプロジェクトのタイプを選択し、「OK」をクリックします。
ナビゲータで、新規プロジェクトを右クリックして「新規」を選択します。
または、モジュールを選択し、「ファイル」メニュー→「新規」→「ビジネス層」→「EJB」→「エンティティ」または「表からのエンティティ」を選択します。
JDeveloperは、SDO (サービス・データ・オブジェクト)データ・アプリケーション開発フレームワークをサポートします。
SDO 2.0フレームワークおよびAPIを使用すると、物理的にどのようにアクセスされているかに関係なくビジネス・データを簡単に修正できます。SDOは、バックエンド・データソースをカプセル化し、静的または動的なプログラミング・スタイルの選択肢を提供し、接続されたアクセスと切断されたアクセスの両方をサポートします。SDOは、XMLパーサー操作を処理し、データ解析ロジックを自動的にアプリケーションに統合します。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のサービス対応のアプリケーション・モジュールの統合に関する項を参照してください。
JDeveloperによってサポートされるSDOアーキテクチャには、次の機能があります。
J2EEデータ・プログラミング・モデルの簡素化
サービス指向アーキテクチャ(SOA)内のデータの抽出
クライアント間のデータの受渡しに関する標準的方法の作成によるデータ・アプリケーション開発の統合
XMLのサポートおよび統合
J2EEパターンおよびベスト・プラクティスの導入
SDOは、切断されたデータ・グラフの概念に基づくデータ・アプリケーション用の統合フレームワークです。データ・グラフは、ツリー構造またはグラフ構造のデータ・オブジェクトのコレクションです。データ・オブジェクトを操作する汎用コードまたはフレームワーク・コードの開発を実現するには、データ・オブジェクトのデータ・モデルを公開するデータ・オブジェクト・メタデータに対するイントロスペクションが可能であることが重要です。Javaリフレクションの代替策として、SDOは、EJBセッションBeanに詳述されているエンティティまたはデータ・モデル情報に基づいて、作成するXMLスキーマ定義(XSD)ファイルに格納されているメタデータにアクセスするためのAPIを提供します。
JDeveloperのSDO機能は、EJBサービスまたはADF-BCサービスとして使用できます。ADF-BCサービスの使用を選択する場合、weblogic-application.xml
ファイルにリスナー参照を追加する必要があります。詳細は、第12.6.5項「JPAエンティティ用のSDOサービス・インタフェースの作成方法」を参照してください。
SDOの詳細および仕様は、OSOA (Open Service Oriented Architecture) (http://osoa.org/display/Main/Service+Data+Objects+Home
)を参照してください。
EJBセッションBeanまたはPOJO (Plain Old Java Objects)を介してJPAエンティティ・データにアクセスするためのサービス・インタフェースAPIを簡単に作成できます。このサービス・クラスは、JDeveloper J2EEアプリケーション内のJPAエンティティを作成、取得、更新および削除するための操作を公開します。
SDOサービス・インタフェースを作成するには、次のようにします。
1つ以上のJPAエンティティに対するCRUD操作を公開するEJBセッションBeanまたは通常のJavaクラス(POJO)から開始します。
ウィザードを使用してセッションBeanを作成できます。詳細は、第12.7.2項「セッションBeanの作成方法」を参照してください。
「構造」ウィンドウで、EJBセッションBeanまたはPOJOを右クリックして「サービス・インタフェースの作成」を選択します。
サービスAPIで使用可能にするメソッドを選択します。
デフォルトでは、セッションBeanインタフェース内のすべてのメソッドが選択されます。チェック・ボックスをクリックし、メソッドを選択するか選択を解除します。
このリリースでは、サービス・インタフェースを作成すると、元のセッションBeanファイルおよびリモート(またはローカル)インタフェースが変更されます。元のメソッドと一致する新規メソッドが追加されますが、これらは、JPAエンティティではなく、新しく定義されたSDOデータ・オブジェクトを参照します。これらのSDOデータ・オブジェクトは、JPAエンティティと一致し、XSDファイル(これもプロジェクトに追加されます)で定義され、これらの名前にはDeptSDO
やEmployeeSDO
などのようにSDOが付けられます。「バックアップ・ファイル」を選択し、元のセッションBeanファイルのバックアップを作成します。
「OK」をクリックします。
SDO外部バインディングを使用してファブリック・コンポジットからEJB/POJO SDO ADF-BCサービスを使用するには、ServiceRegistry
ロジックを呼び出すためのWeblogicアプリケーション・デプロイメント・リスナーを設定する必要があります。これを設定するには、weblogic-application.xml
ファイルにリスナー参照を追加します。
リスナー参照を追加するには、次のようにします。
デフォルトでは<workspace-directory>/src/META-INF
にあるweblogic-application.xml
に例12-5のコードを追加します。
例12-5 weblogic-application.xmlに追加するコード
<listener> <listener-class> oracle.jbo.client.svc.ADFApplicationLifecycleListener </listener-class> </listener>
このリスナーが追加されると、SDOサービス・アプリケーション名_JBOServiceRegistry_
がcomposite.xml
内のファブリック・サービス・レジストリに自動的に登録されます。
SDOサービス・インタフェースを作成すると、サービス・インタフェースをサポートするために必要なファイルが自動的に作成されます。これらのファイルには、次のものがあります。
SessionEJBBeanWS.wsdl: このファイルには、SOAアプリケーションへのエントリ・ポイントまたはSOAアプリケーションからの参照ポイントを提供するサービスの機能が記述されています。WSDLファイルは標準規約言語を提供するもので、サービスの機能を理解する場合に必須です。
SessionEJBBeanWS.xsd: これは、SDOデータ型の観点からサービス・インタフェース・メソッドを定義するXMLスキーマ・ファイルです。セッションBeanインタフェースに含まれていたすべてのエンティティがこのスキーマ・ファイル内で対応するDataObject要素を持ちます。実行時には、XSDHelper.INSTANCE.define()
メソッドを呼び出すことにより、これらのDataObjectにSDOランタイムが登録されます。SDOタイプごとに静的タイプ固有のDataObjectが定義されます。
JDeveloper統合サーバーをデプロイすると、対応する既存の表がマップされていないすべてのエンティティにデータベース表が自動的に作成されます。マップされていないJPAエンティティごとに、1つのデータベース表が生成されます。
注意: 主キー参照整合性制約が生成されますが、その他の制約は生成されない場合があります。 |
JPAエンティティからデータベース表を生成するには、次のようにします。
モデリング・ツールまたはエンティティの作成ウィザードを使用して、JPAエンティティを作成します。詳細は、第12.6.2項「JPAエンティティの作成方法」を参照してください。
必要に応じてエンティティを変更し、フィールドおよび制約を追加します。
表に名前を付けます。
EJB 3.0 - Beanクラスに注釈を付けて、表名を指定してください。詳細は、Enterprise JavaBean仕様(http://www.oracle.com/technetwork/java/docs-135218.html
)を参照してください。
永続性ユニットをデプロイします。詳細は、第12.9項「EJBモジュールおよびJPA永続性ユニットのデプロイ」を参照してください。
注釈を使用すると、アプリケーション・コンポーネントに必要なデプロイメント・ディスクリプタの数を減らすことによってデプロイメント・タスクを簡素化できます。また、注釈を使用して、インタフェースなどのアーチファクトを生成することもできます。
注釈は、Javaソース・ファイルに追加されるメタデータ修飾子です。注釈は、コンパイル時にJavaコンパイラによってクラスにコンパイルされ、クラス、フィールド、メソッド、パラメータ、ローカル変数、コンストラクタ、列挙およびパッケージで指定できます。注釈を使用すると、コードの生成、コードの文書化、または実行時の高度なビジネスレベル・セキュリティや特別なビジネス・ロジックなどのサービスの提供のための属性を指定できます。
また、EJB/JPAクラスで使用可能な注釈のタイプはすべてXMLデプロイメント・ディスクリプタ・ファイルに追加することもできます。実行時には、XMLにより、クラス・レベルで追加された任意の注釈が上書きされます。
次のステートレス・セッションBeanのように、注釈には@
記号がマークされます。
@Stateless public class MySessionBean
EJB 3.0の注釈の詳細は、http://download.oracle.com/javase/1.5.0/docs/guide/language/annotations.html
を参照してください。
注意: 注釈はEJB 3.0の新機能であり、EJBの前のバージョンでは使用できません。 |
デザインタイム時には、プロパティ・インスペクタを介して使用可能な注釈のリストが表示されます。注釈機能を使用すると、任意の適切なJavaクラスをEJBまたはJPAコンポーネントに変更できます。詳細は、第12.6.8項「Javaクラスの注釈方法」を参照してください。
注釈を使用してBeanタイプを示すことができます。Beanタイプの注釈を標準クラスに追加すると、EJBになります。
次のタイプの注釈を使用できます。
ステートレス・セッションBeanです。「True」または「False」を選択し、ステートレス・セッションBeanとしてクラスに注釈を付けます。
ステートフル・セッションBeanです。「True」または「False」を選択し、ステートフル・セッションBeanとしてクラスに注釈を付けます。
メッセージドリブンBeanです。「True」または「False」を選択し、メッセージドリブンBeanとしてクラスに注釈を付けます。
注釈は、新規Java永続性APIをエンティティBeanの代替手段としてサポートします。
次のタイプの注釈を使用できます。
JPAエンティティです。「True」または「False」を選択し、JPAエンティティとしてクラスに注釈を付けます。
JPAマップされたスーパークラスです。「True」または「False」を選択し、JPAマップされたスーパークラスとしてクラスに注釈を付けます。
JPA埋込み可能です。「True」または「False」を選択し、JPA埋込み可能としてクラスに注釈を付けます。
標準JavaクラスをEJB/JPAコンポーネントに変換した後、またはEJB/JPAウィザードの1つを使用してコンポーネントを作成した場合、プロパティ・インスペクタには、異なるコンテキスト・オプション・セットが表示され、これを使用して、コンポーネント・クラス内の様々なメンバーの注釈を追加または編集できます。
設計時には、クラスに挿入可能な注釈のリストが表示されます。これらのオプションは、使用しているクラスのタイプや選択したメンバーの内容によって異なります。
任意の標準Javaクラスに注釈を付けてEJB/JPAコンポーネントにすることができます。クラスが注釈を使用してEJB/JPAとして定義されたら、JDeveloperプロパティ・インスペクタ内で選択可能な様々なメンバー・レベルの注釈を使用してコンポーネントを簡単にカスタマイズできます。
注意: 注釈はEJB 3.0でのみ使用可能であり、EJBの前のバージョンでは使用できません。 |
JavaクラスにEJB/JPAコンポーネントとして注釈を付けるには、次のようにします。
アプリケーション・ナビゲータで、変換するクラスを選択します。
「構造」ウィンドウで、クラス名をダブルクリックします。
クラスがJavaソース・エディタで開いている場合、クラス定義行にカーソルを置きます。
プロパティ・インスペクタを開き、「EJB/JPA」タブを開いて、作成するコンポーネントのタイプを選択します。「True」を選択します。
JavaクラスがEJB/JPAコンポーネントとして注釈を付けられると、プロパティ・インスペクタから「EJB/JPA」タブが表示されなくなり、選択したコンポーネント・タイプに固有の新規タブが表示されます。コンポーネントを標準Javaクラスに戻すには、コードから注釈を削除し、プロパティ・インスペクタに表示されているEJB/JPAコンポーネント・タイプをリセットします。
注意: ウィザードを介して作成されたEJBまたはJPAコンポーネントには、すでにクラス・タイプの注釈が含まれます。詳細は、第12.3項「EJB 3.0アプリケーションの構築および開発プロセス」を参照してください。 |
クラス・レベルの注釈を使用してJavaクラスがEJB/JPAコンポーネントに変換されたら、プロパティ・インスペクタを使用して、このコンポーネント内のメンバー・フィールドまたはメソッドに対する注釈を追加または編集します。
EJB/JPAコンポーネント内の注釈を追加または編集するには、次のようにします。
アプリケーション・ナビゲータで、注釈を付けるクラスを選択します。
「構造」ウィンドウで、注釈を付けるメンバーをダブルクリックします。
クラスがJavaソース・エディタで開いている場合、かわりに注釈を挿入する場所にカーソルを置きます。
プロパティ・インスペクタで、EJB/JPAタイプに対応するタブを選択します。
選択した特定のメンバーで使用可能な任意の注釈から選択します。
データベース表からエンティティを作成すると、外部キーはエンティティ間の関連として解析されます。これらの関連をさらに定義したり、新規関連を作成したり、JDeveloperのモデリング・ツールを使用して既存の関連を既存の表にマップできます。モデリング・ツールを使用すると、関連をエンティティ間の線で表したり、線の構成を変更することによって関連を変更できます。詳細は、第23.3項「ダイアグラムでのEJB/JPAコンポーネントのモデル化」を参照してください。
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
によって表されるリモート・インタフェースを返すために内部で使用されます。
Java永続性APIを使用すると、Java EE 5アプリケーション・サーバーの内部とEJBコンテナの外部の両方で動作する標準的で移植可能な方法でJavaオブジェクトをリレーショナル・データベース表に宣言的にマップできます。このアプローチの場合、Java永続性が大幅に簡素化され、オブジェクト・リレーショナル・マッピング・アプローチが提供されます。
Oracle TopLinkでは、Javaソース・コード内のメタデータ注釈を使用してエンティティのJPA動作を構成できます。実行時に、コードは対応するJavaクラス・ファイルにコンパイルされます。
JavaクラスをJPAエンティティとして指定するには、例12-6に示すように、@Entity
注釈を使用します。
注釈を選択して追加し、デプロイメント・ディスクリプタに指定されているデフォルトを上書きできます。
JPA注釈の詳細は、TopLink JPA注釈参照(http://www.oracle.com/technetwork/middleware/ias/toplink-jpa-annotations-096251.html
)を参照してください。
Javaサービス・ファサードは、アプリケーション・サーバーなしで実行可能な軽量テスト環境を実装します。
EJB 3.0の場合、Javaサービス・ファサードは、コンテナなしで同じ永続性ユニットのエンティティに対してファサード・メソッドを生成できるため、EJBセッション・ファサードと類似しています。
ワークフローをJavaサービス・ファサードと分離すると、参加者JPAオブジェクトにクライアントが直接依存しなくなるため、設計の柔軟性が高まります。参加者を変更するにはJavaサービス・ファサードの変更が必要になる可能性がありますが、ワークフローをファサード内で集中管理すると、このような変更をより管理しやすくなります。すべてのクライアントを変更しなくてもJavaサービス・ファサードを変更するだけですみます。また、ワークフローの職責がセッション・ファサードに委任されたため、クライアント・コードもより単純になりました。クライアントは、ビジネス・オブジェクト間の複雑なワークフロー相互作用を管理する必要がなくなっただけでなく、ビジネス・オブジェクト間の相互依存性も認識する必要はありません。
main()メソッドを使用してサンプルJavaクライアントを生成してJavaサービス・クラスを実行可能にすることを選択できます。
JDeveloperのJavaサービス・ファサード・ウィザードは、エンティティに対するサービス・ファサードとしてJavaクラスを作成する際に使用します。新規Javaサービス・ファサードを作成するには、「ファイル」メニュー→「新規」→「ビジネス層」→「EJB」→Javaサービス・ファサードを選択します。
また、サービス・ファサードからデータ・コントロールを作成することもできます。アプリケーション・ナビゲータで、サービス・ファサードの名前を右クリックして「データ・コントロールの作成」を選択します。「Beanデータ・コントロール・インタフェース・チューザ」ダイアログから、oracle.binding.*
データ・コントロール・インタフェースの実装を選択できます。このインタフェースには、TransactionalDataControl
、UpdatableDataControl
およびManagedDataControl
があります。詳細は、ダイアログで「ヘルプ」ボタンを選択してください。
セッションBeanは、アプリケーション・サーバー内の単一クライアントを表します。サーバー上でデプロイされたアプリケーションにアクセスするために、クライアントはセッションBeanメソッドを呼び出します。セッションBeanは、サーバー内でビジネス・タスクを実行することによってクライアントに複雑な処理が及ばないようにしながら、クライアントのために処理を実行します。セッションBeanは、インタラクティブ・セッションと類似しています。インタラクティブ・セッションに関わることができるのは1人のユーザーのみであるのと同じように、セッションBeanは共有されず、1つのクライアントのみが関わります。インタラクティブ・セッションの場合と同様、セッションBeanはデータをデータベースに保存しないため、永続的ではありません。クライアントが終了すると、セッションBeanは終了したように見え、クライアントとは関係なくなります。
JDeveloperのセッションBeanウィザードを使用してセッションBeanおよびセッションBeanファサードを作成します。詳細は、第12.7.2項「セッションBeanの作成方法」を参照してください。
セッションBeanには2種類あります。
ステートフル。ステートフル・セッションBeanは、クライアントのかわりに対話状態を維持します。対話状態は、セッションBeanフィールド値とセッションBeanフィールドから到達可能なすべてのオブジェクトとして定義されます。ステートフル・セッションBeanは、永続的なデータ・ストアのデータを直接表すものではなく、クライアントのかわりにデータにアクセスしてデータを更新します。通常、ステートフル・セッションBeanの存続期間はクライアントの存続期間と同じです。
ステートレス。ステートレス・セッションBeanは厳密には、サーバー側の動作を提供することを目的として設計されています。これは、ユーザー固有のデータを含まないため、無名です。EJBアーキテクチャは、単一のステートレス・セッションBeanが多くのクライアントのニーズに応じて処理を実行する手段を提供します。クライアントによって呼び出されたメソッドに応じた処理に関わらない場合、ステートレス・セッションBeanインスタンスはすべて同等です。ステートレスという用語は、特定のクライアントに関するステート情報を持たないことを意味します。ただし、ステートレス・セッションBeanは、オープン・データベース接続など、クライアント固有ではないステートを持つ場合があります。
JDeveloperでは、セッションBeanウィザードを介してセッションBeanを作成する場合は常に、セッション・ファサード・メソッドの自動生成を選択できます。これにより、ビジネス・ワークフローのセッション・ファサードとして機能するセッションBeanが作成されます。詳細は、第12.7.2項「セッションBeanの作成方法」を参照してください。
セッション・ファサードはセッションBeanとして実装されます。セッションBeanファサードは、アプリケーションのビジネス・サービスに対して単一のインタフェースを提供することにより、ワークフローに参加するビジネス・オブジェクト間の複雑な相互作用をカプセル化します。セッション・ファサードは、多数のBusinessObjects間の関連を管理し、クライアントに対して高度な抽象化を提供します。
セッション・ファサードにはステートフルとステートレスのいずれかがあります。これらは、ウィザードでセッション・ファサードを作成する際に定義します。
セッション・ファサードの詳細は、Oracle Technology Network (http://www.oracle.com/technetwork/java/sessionfacade-141285.html
)を参照してください。
ウィザードを使用して、セッションBeanの作成時にセッション・ファサードを自動的に実装して、実装するメソッドを選択します。EJBエンティティを作成すると、同じプロジェクト内で作成するセッションBeanは、公開するエンティティおよびメソッドを認識します。
セッションBeanウィザードを使用して、新規のセッションBeanまたはセッション・ファサードBeanを作成します。また、モデリング・ツールを使用してセッションBeanを作成することもできます。
ウィザードを使用してセッションBeanまたはセッション・ファサードを作成するには、次のようにします。
ナビゲータで、「ファイル」→「新規」を選択します。
「新規ギャラリ」で、「EJB」フォルダの下にある「ビジネス層」カテゴリから「セッションBean」を選択します。
Beanをセッション・ファサードにするには、「EJBの名前とオプション」ページで「セッション・ファサード・メソッドの生成」を選択します。
注意: セッション・ファサードBeanを生成するには、永続性ユニットがすでに作成されている必要があります。永続性ユニットを生成するには同じステップに従いますが、「セッションBean」ではなく「JPA永続性ユニット」を選択します。 |
ウィザードの残りのステップを完了します。
セッションBeanファサード・メソッドを追加または削除するには、次のようにします。
アプリケーション・ナビゲータで、編集するセッションBeanを選択します。
右クリックして「セッション・ファサードの編集」を選択します。
「セッション・ファサード・オプションの指定」ダイアログで、メソッドを選択してメソッドがファサードを介して公開されるようにするか、メソッドの選択を解除してメソッドが公開されないようにします。
セッション・ファサードの詳細は、コアJ2EEパターン・カタログ(http://www.oracle.com/technetwork/java/sessionfacade-141285.html
)を参照してください。
セッションBeanとエンティティ間のローカル参照を作成して、セッション・ファサードを手動で作成することもできます。
ローカル参照を作成するには、次のようにします。
まだ作成していない場合は、セッションBeanを作成します。
Bean間にローカル参照を作成します。
Beanクラスの場合: EJB 3.0を使用している場合は、Beanクラスに注釈を付けて参照を作成します。
EJBモジュール・エディタを使用する場合: EJB 2.1 (および以前のバージョン)を使用している場合は、アプリケーション・ナビゲータで「EJB」ノードを選択し、構造ペインで「メソッド」をダブルクリックし、「EJBモジュール・エディタ」を開きます。「EJBローカル参照」を選択します。
EJBダイアグラムでセッションBeanを作成するには、次のようにします。
EJBダイアグラムを開きます。
EJBダイアグラムがない場合は、「ファイル」→「新規」を選択し、「ビジネス層」カテゴリから「EJBダイアグラム」を選択します。
コンポーネント・パレットで「セッションBean」をクリックします。
コンポーネント・パレットが表示されていない場合、「表示」メニューから「コンポーネント・パレット」を選択します。
EJBダイアグラムの中をクリックします(ドラッグ・アンド・ドロップしないでください)。
新規モジュールと既存のモジュールの両方でEJBを作成できます。
既存のモジュールにEJBを作成するには、次のようにします。
ナビゲータでEJBモジュールを右クリックし、新規EJBセッションまたは「メッセージドリブンBean」を選択します。
または、モジュールを選択し、「ファイル」メニュー→「新規」→「ビジネス層」→EJBセッションまたは「メッセージドリブンBean」を選択します。
ウィザードのステップに従います。
新規のEJBモジュールにEJBを作成するには、次のようにします。
ナビゲータで、「ファイル」→「新規」→「一般」→「プロジェクト」を選択します。
「新規ギャラリ」で、作成するプロジェクトのタイプを選択し、「OK」をクリックします。
ナビゲータで、新規プロジェクトを右クリックして「新規」を選択します。
「新規」ダイアログで、「ビジネス層」カテゴリを開きます。
「EJB」をクリックし、「セッションBean」または「メッセージドリブンBean」を選択します。
または、モジュールを選択し、「ファイル」メニュー→「新規」→「ビジネス層」→EJBセッションまたは「メッセージドリブンBean」を選択します。
「OK」をクリックします。
ウィザードのステップに従います。
プロジェクトにEJBが追加された後、そこに含まれるメソッドを追加、削除または編集できます。次で説明するようにメソッドを追加すると、定義時に変更がリモート・インタフェースとホーム・インタフェースで同期化されます。
メソッドを追加するには、次のようにします(EJB 2.1)。
アプリケーション・ナビゲータで、EJBを選択します。
構造ペインで、「メソッド」ノードを右クリックし、「新規EJBメソッド」を選択し、作成するメソッドのタイプを選択します。
「メソッドの詳細」ダイアログで、必要に応じて詳細を追加します。
終わったら、「OK」をクリックします。
メソッドを追加するには、次のようにします(EJB 3.0)。
アプリケーション・ナビゲータで、EJBを選択します。
構造ペインでEJBを右クリックし、「Enterprise Java Bean (EJB)」→「新規メソッド」を選択します。
「Beanメソッドの詳細」ダイアログで、必要に応じて詳細を追加します。
終わったら、「OK」をクリックします。
メソッドを削除するには、次のようにします(EJB 2.1)。
アプリケーション・ナビゲータで、EJBを選択します。
構造ペインで「メソッド」ノードを開きます。
削除するメソッドを右クリックします。複数を削除する場合、[Ctrl]または[Shift]を押しながらクリックしてそれらを選択し、選択内容を右クリックします。
「メソッドの削除...」を選択します。
「はい」をクリックして確認します。
メソッドを削除するには、次のようにします(EJB 3.0)。
アプリケーション・ナビゲータで、EJBを選択します。
構造ペインで、メソッドをダブルクリックしてソース・ファイル内で検索します。
ソース・ファイルで、メソッドを削除します。
メソッドを編集するには、次のようにします(EJB 2.1)。
アプリケーション・ナビゲータで、EJBを選択します。
構造ペインで「メソッド」ノードを開きます。
編集するメソッドを右クリックし、「プロパティ」を選択します。
「メソッドの詳細」ダイアログで、必要に応じて詳細を編集します。
終わったら、「OK」をクリックします。
メソッドを編集するには、次のようにします(EJB 3.0)。
アプリケーション・ナビゲータで、EJBを選択します。
構造ペインで、EJBを右クリックし、「Enterprise Java Bean (EJB)」→「プロパティ」を選択します。
「Beanメソッドの詳細」ダイアログで、必要に応じて詳細を編集します。
終わったら、「OK」をクリックします。
EJBダイアグラムまたはEJBモジュール・エディタを介して、EJBにフィールドを追加できます。
EJBダイアグラム上でフィールドを追加するには、次のようにします(EJB 2.1)。
ダイアグラム内のEJB上のフィールド・コンパートメント(最初のコンパートメント)をクリックします。
フィールドの名前とタイプを入力します。
EJBモジュール・エディタを使用してフィールドを追加するには、次のようにします(EJB 2.1)。
アプリケーション・ナビゲータで、フィールドを追加するEJBを右クリックし、「プロパティ」を選択します。
EJBモジュール・エディタで、EJBをクリックして開き、「フィールド」を選択します。
「追加」をクリックします。
「フィールド詳細」ダイアログで、必要に応じて詳細を追加します。
フィールドを追加するには、次のようにします(EJB 3.0)。
アプリケーション・ナビゲータで、EJBを選択します。
構造ペインで、EJBを右クリックし、「Enterprise Java Bean (EJB)」ノード→「新規フィールド」を選択します。
「フィールド詳細」ダイアログで、必要に応じて詳細を追加します。
終わったら、「OK」をクリックします。
次に示すように、フィールドをEJBから削除できます。
EJBダイアグラム上のフィールドを削除するには、次のようにします。
EJB上のフィールド・コンパートメント(最初のコンパートメント)をクリックします。
フィールドをハイライトして[Del]キーを押します。
EJBモジュール・エディタを使用してフィールドを削除するには、次のようにします(EJB 2.1)。
アプリケーション・ナビゲータで、フィールドを追加するEJBのノードを右クリックし、「プロパティ」を選択します。
EJBモジュール・エディタで、EJBをクリックして開き、「フィールド」を選択します。
削除するフィールドを選択します。
「削除」をクリックします。
フィールドを削除するには、次のようにします(EJB 3.0)。
アプリケーション・ナビゲータで、EJBを選択します。
構造ペインで、フィールドをダブルクリックしてソース・ファイル内で検索します。
ソース・ファイルで、フィールドを削除します。
環境エントリは、Beanのビジネス・ロジックをカスタマイズできる名前と値のペアです。環境エントリはエンタープライズBeanのデプロイメント・ディスクリプタに格納されるため、ソース・コードを変更せずにBeanのビジネス・ロジックを変更できます。
たとえば、注文を計算するEJBは、受注数量や特定のステータス(シルバー、ゴールド、プラチナ)に応じて、あるいは販売促進のために、割引きを行うことがあります。Beanのアプリケーションをデプロイする前に、特定の割引率を指定できます。アプリケーションを実行すると、メソッドは環境エントリをコールして割引値を調べます。別のデプロイメントについてその割引率を変更する場合、ソース・コードを変更する必要はなく、デプロイメント・ディスクリプタの環境エントリの値を変更するだけです。
ソース・コードで環境エントリに注釈を付けます。
完全なEJB 3.0 Java Community Processの仕様および文書は、http://www.oracle.com/technetwork/java/docs-135218.html
を参照してください。
クライアントにデータを公開する方法は、アプリケーションの開発方法に応じて異なります。
Oracle ADFフレームワークを使用している場合、クライアントに対するデータ公開の推奨方法は、セッション・ファサードのデザイン・パターンを実装し、セッションBeanをデータ・コントロール・パレットに挿入することです。このオプションは、データ統合を大幅に簡素化し、JDeveloper Studioリリースでのみ使用できます。詳細は、第12.7項「セッションBeanでのビジネス・プロセスの実装」および第12.7.1項「セッション・ファサードの使用」を参照してください。
Oracle ADFフレームワークを使用していない場合は、通常はマネージドBeanを作成してJSF/JSPページへの接続を調整します。詳細は、第11.2項「JavaServer Facesを使用したアプリケーションの開発」を参照してください。
リソース参照は、リソースに対するコンポーネントのコード名を識別するデプロイメント・ディスクリプタ内の要素です。リソース参照は、コネクタおよびデータベース接続を取得するため、ならびにJMS接続ファクトリ、JavaMailセッションおよびURLリンクにアクセスするために使用されます。
EJB 3.0リソース参照を追加または変更するには、次のようにします。
ソース・コードに移動し、リソース参照に注釈を付けます。
主キーは、1つ以上の持続属性を持つ一意の識別子です。これは、同じタイプの他のすべてのインスタンスからクラスの1つのインスタンスを識別します。主キーは、リレーションシップの定義および問合せの定義に使用します。
JPAエンティティ・インスタンスごとに1つの主キーが必要です。データベース・スキーマに応じて、永続フィールドからシンプル主キーを定義したり、複数の永続フィールドからコンポジット主キーを定義できます。また、自動主キー値生成を定義し、JPAエンティティ実装を簡素化することもできます。
シンプル主キーを指定する最も簡単な方法は、単一のプリミティブに対する注釈を使用するか、JDKオブジェクト・タイプ・エンティティ・フィールドを主キーとして使用することです。また、デプロイメントXMLを使用してデプロイメント時にシンプル主キーを指定することもできます。
注釈を使用してシンプル主キーを構成するには、次のようにします。
JPAエンティティ実装で、例12-7に示すように、@Id
注釈を使用して主キー・フィールドに注釈を付けます。
例12-7 注釈を使用した主キーの構成
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; } ... }
アプリケーションをパッケージ化し、デプロイします。
デプロイメントXMLを使用してシンプル主キーを構成するには、次のようにします。
JPAエンティティ実装で、例12-8に示すように、主キー・フィールドを実装します。
特定のADF Faces機能では、主キーを指定する必要があります。たとえば、af:tableSelectMany
コンポーネントを使用するADF Faces表がある場合、ソートを実装するために主キーを指定する必要があります。EJB/JPAエンティティを表から(EJB 3.0を使用して)作成する場合、デフォルトでは主キーが指定されます。しかし、主キーを指定する必要がある場合は、次を実行します。
属性を主キーとして指定するには、次のようにします。
エンティティごとにXML定義を作成するためにADFデータ・コントロールをまだ作成していない場合は、この作業を行う必要があります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド』のJava EE WebアプリケーションでのADFモデル・データ・バインディングの使用に関する項を参照してください。
アプリケーション・ナビゲータで、EJBエンティティのXMLファイルを選択します。
構造ペインで、エンティティ属性を選択し、「表示」メニューから「プロパティ・インスペクタ」を選択します。
プロパティ・インスペクタで、主キーとして使用する属性を検索し、「PrimaryKey」値を「True」に設定します。
JDeveloperでは、ADF Fusion Webアプリケーションを構築する際にデータ・コントロール・コンポーネントの完全セットが自動的に提供されます。Java EEアプリケーションまたはEJBプロジェクト(あるいはその両方)を構築する場合、個別セッションBeanでADFデータ・コントロールを割り当てます。これにより、Beanと同じ名前のデータ・コントロール・ファイルが追加されます。
EJBのADFデータ・コントロール使用の完全な詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Java EE開発者ガイド』のJava EE WebアプリケーションでのADFモデル・データ・バインディングの使用に関する項を参照してください。
ダイアグラムでのEJBおよびJPAコンポーネントのモデル化の詳細は、第23.3項「ダイアグラムでのEJB/JPAコンポーネントのモデル化」を参照してください。
EJBモジュールは、1つ以上のEJB、永続性ユニットおよびオプションのEJBデプロイメント・ディスクリプタで構成されるソフトウェア・ユニットです。1つのJDeveloperプロジェクトに含まれるのは、1つのEJBモジュールのみです。デプロイ時には、モジュールはejb.jar
ファイルとしてパッケージ化されます。
エンティティBeanは以前、セッションBeanおよびメッセージドリブンBeanとともにEJB JARファイルにパッケージ化されていました。現在では、JPAエンティティおよび永続性ユニットのテクノロジを使用して、これらはデプロイ時に独自のJARファイルpersistenceunit.jar
にパッケージ化されます。
現在、エンティティBean (JPAエンティティ)は、persistence.xml
ファイルが含まれるJPA永続性アーカイブJARに個別に格納されます。JPA永続性ユニットはEJBモジュール・パッケージの一部である必要はなく、the ejb.jar
ファイル内にバンドルできます。
1つのJDeveloperプロジェクトに含まれるのは、1つのEJBモジュールのみです。プロジェクト内で最初のセッションBeanまたはメッセージドリブンBeanを作成する場合、モジュールが存在しなければ、モジュールは自動的に作成されます。新規EJBモジュールのEJBバージョンと永続性マネージャは選択できます。
プロジェクトをデプロイする場合、セッションBeanおよびメッセージドリブンBeanとデプロイメント・ディスクリプタの集合を、アプリケーション・サーバーへのデプロイメントまたはアーカイブ・ファイルとしてのデプロイメントの準備が整っているEJB JARファイル(.jarファイル)に変換します。永続性ユニットを独自のJARファイルに限定することにより、永続性ユニットを他のアプリケーションで簡単に再利用できるようになります。詳細は、第9.1項「アプリケーションのデプロイについて」を参照してください。
JPA永続性ユニットは、persistence.xml
ファイル、1つ以上のオプションのorm.xml
ファイル、および永続性ユニットに属する管理対象エンティティ・クラスで構成されています。永続性ユニットは、エンティティ・マネージャ、データソース、永続管理対象クラスおよびマッピング・メタデータの論理グループです。永続性ユニットは、エンティティ・マネージャ・プロバイダ、構成プロパティおよび永続管理対象クラスなどの詳細を論理的にグループ化することにより、エンティティ・マネージャの構成を定義します。
各永続性ユニットには名前を指定する必要があります。特定のEJB-JAR、WAR、EARまたはアプリケーション・クライアントJAR内に存在できるのは特定の名前を持つ1つの永続性ユニットのみです。永続性ユニットを独自の永続性アーカイブにパッケージ化し、Java EEモジュールによるアクセスが必要な任意の対象にこのアーカイブを含めることができます。
persistence.xml
ファイルにはセクションまたはグループが含まれます。これらのグループは、エンティティおよびエンティティに関連するランタイム・データに対応します。エンティティ・ウィザードを使用して新規エンティティを作成するときに、プロジェクト内に既存の永続性ユニットがある場合、エンティティはpersistence.xml内の独自のセクションに挿入されます。既存の永続性ユニットがない場合は、エンティティ定義のために含まれるセクションとともに永続性ユニットが作成されます。
META-INFディレクトリにpersistence.xmlファイルが含まれるJARファイルまたはディレクトリは、永続性ユニットのルートと呼ばれます。エンティティを使用するEJB 3.0アプリケーションには、明示的に、またはOC4Jのデフォルトの永続性ユニットを使用して少なくとも1つの永続性ユニットのルートを定義する必要があります。永続性ユニットをデプロイすると、persistenceunit.jar
と呼ばれるJARファイルが作成されます。詳細は、第9.1項「アプリケーションのデプロイについて」を参照してください。
JDeveloperの永続性ユニット・ウィザードを使用すると、エンティティの永続性ユニットを簡単に作成できます。また、JPAエンティティを作成する場合、デフォルトの永続性ユニットがまだない場合はこれが作成されます。
JPA永続性ユニットを作成するには、次のようにします。
アプリケーション・ナビゲータで、プロジェクトを選択します。
「ファイル」メニュー→「新規」→「ビジネス層」→「EJB」→「JPA永続性ユニット」を選択します。
ウィザードのステップを完了します。
JARファイルまたはデプロイメント・ディスクリプタから既存のEJBをインポートできます。
EJBモジュール、またはEJBモジュール内のEJBのサブセットをプロジェクトにインポートするには、次のようにします。
「ファイル」メニューから「インポート」を選択します。
「インポート」ダイアログで「EJB JARファイル(.jar)」を選択します。
ウィザードのステップに従います。
EJBデプロイメント・ディスクリプタ・ファイル(ejb-jar.xml)をインポートするには、次のようにします。
「ファイル」メニューから「インポート」を選択します。
「インポート」ダイアログで「EJBデプロイメント・ディスクリプタ・ファイル(ejb-jar.xml)」を選択します。
ウィザードのステップに従います。
注意: このウィザードを使用してデプロイメント・ディスクリプタをインポートした後、同じウィザードで他のファイルをインポートすると、最後に使用したディスクリプタ・ファイル、JARファイルおよびIDE設定ファイル内のディスクリプタ・ソース・ディレクトリがキャッシュされるので便利です。これにより、たとえば、EJBモジュールを複数のモジュールに分割する、同じディレクトリ内にある複数のJARファイルをインポートする、などのタスクが容易になります。 |
WebLogicデプロイメント・ディスクリプタ・ファイル(weblogic-ejb-jar.xml)をインポートするには、次のようにします。
「ファイル」メニューから「インポート」を選択します。
「インポート」ダイアログで「EJBデプロイメント・ディスクリプタ・ファイル(ejb-jar.xml)」を選択します。
ウィザードのステップに従います。
ウィザードの完了後に、ナビゲータで「weblogic-ejb-jar.xml」を右クリックして「OC4Jにエクスポート」を選択します。
既存のモジュールに同じ名前のEJBがすでに存在している場合、競合を避けるため、そのEJBはインポートされません。
EJBをテストするには、EJBインスタンスを作成または検索し、そのリモート・インタフェース・メソッドをコールできるクライアント・プログラムを実行する必要があります。JDeveloperには、迅速にクライアントを作成できるサンプル・クライアント・ユーティリティが用意されています。EJBの実行およびテストには、統合サーバーまたはリモート・サーバーを使用しますが、どちらの場合にもサンプル・クライアント・ユーティリティを使用してクライアントを作成できます。
統合Oracle WebLogic ServerはJDeveloper内で動作します。このサーバーを使用すると、EJBの迅速かつ簡単な実行およびテストが可能であり、何の変更も加えずにそのEJBをデプロイできます。このサーバーを使用する場合、デプロイメント・プロファイルは不要で、初期化の必要もありません。
統合Oracle WebLogic Serverでサンプル・クライアントを実行するには、次のようにします。
アプリケーション・ナビゲータで、EJBを右クリックして「実行」を選択します。
「メッセージ」ペインではOracle WebLogic Serverは起動しています。
EJBを右クリックし、ポップアップ・メニューから「サンプルJavaクライアントの作成」を選択します。
デフォルトで、統合Oracle WebLogic Serverに対してクライアントを作成するオプションが選択されているので、「OK」をクリックします。
クライアントが作成され、コード・エディタで開かれます。
セッションBeanがJPAエンティティに対するファサードとして機能する場合、問合せメソッドをインスタンス化するためのコードが生成されます。Beanに対してメソッドを公開した場合、生成されたクライアントには、非コメント化して呼び出すことができるメソッドが含まれます。
EJBがアプリケーション・ナビゲータから正常に起動されたら、サンプル・クライアントを右クリックして「実行」を選択します。
リモート・サーバー上でEJBをテストするには、EJBをデプロイしてからサンプル・クライアントを作成する必要があります。最初にデプロイを行うと、デプロイされたアプリケーションがフレームワークによって取得され、それがクライアントの選択リストに移入されます。
注意: 同じモジュールで異なるバージョンのEJBを組み合せることはできません。 |
リモート・サーバーを使用してサンプル・クライアントを実行するには、次のようにします。
使用しているアプリケーション・サーバーを起動します。
アプリケーション・ナビゲータで、プロジェクトのノードを右クリックして、「新規」を選択します。
「新規」ダイアログ・ボックスで、「デプロイメント・プロファイル」カテゴリをクリックし、「ビジネス・コンポーネントEJBセッションBean」を選択します。
アプリケーション・ナビゲータに、新規デプロイメント・プロファイルが表示されます。
デプロイメント・プロファイルを右クリックし、「新規接続にデプロイ」を選択します。
ダイアログ・ボックスで、使用するアプリケーション・サーバーを指定します。(デフォルトでは、JDeveloperに同梱されるOracle WebLogic Serverが選択されています。)
「OK」をクリックします。
アプリケーション・ナビゲータで、デプロイメント・プロファイルを右クリックし、「<named connection>に配布」を選択します。
アプリケーション・ナビゲータで、EJBを右クリックして「サンプルJavaクライアントの作成」を選択します。
ダイアログ・ボックスで、リモート・アプリケーション・サーバーへの接続を選択します。コンボ・ボックスにリストされているデプロイされたJava EEアプリケーションの1つを選択します。
「OK」をクリックします。
クライアントが作成され、アプリケーション・ナビゲータに表示されます。
クライアントを右クリックし、「実行」を選択します。
「メッセージ」ペインに実行の出力が表示されます。
JDeveloperでは、EJBに対するJUnit回帰テストがサポートされています。JUnitは、JDeveloperのオプション機能として用意されているオープン・ソースのJava回帰テスト用のフレームワークです。この機能を使用するには、JUnit拡張機能をインストールする必要があります。
JUnitを使用して、コードを検証するテストを記述および実行します。JUnit拡張機能をインストールした後、シンプル・ウィザードを使用してセッションBeanまたはJavaクラス・ファイルを選択し、これらのファイル内でテストするメソッドを選択し、JUnitテストを開始できます。
EJBに対してJUnitテストを実行するには、次のようにします。
JDeveloperの「ヘルプ」メニューからJUnit拡張機能をインストールします。詳細は、第18.12.1項「JUnitのインストール方法」を参照してください。
アプリケーション・ナビゲータでEJBセッションBeanまたは通常のJavaクラス(POJO)を選択します。また、ウィザード内でこれにナビゲートすることもできます。
「ファイル」メニュー→「新規」→「ビジネス層」→「EJB」→「EJB JUnit TestCase」をクリックします。
JUnitウィザードを起動します。
ウィザードのステップを完了します。
JUnitの詳細は、 http://www.junit.org/
にあるJUnitのWebサイトを参照してください。