セッションBeanによって、ビジネス・レイヤーの機能がクライアントに公開されます。
セッションBeanの一般的な使用方法の1つは、セッション・ファサードのJ2EEデザイン・パターンを実装することです。 セッション・ファサードは、データを集計し、その結果をサービス・レイヤーを介してアプリケーションに提供するセッションBeanです。 セッション・ファサードには、サービスをクライアントに公開するメソッドの他に、エンティティにアクセスするメソッドもあります。 セッションBeanには、コンテナを介したトランザクション・コンテキストがあるため、永続CRUD(Create, Retrieve, Update, Delete)機能が自動的にサポートされます。
セッションBeanを作成するには、セッションBean作成ウィザードを使用します。 このウィザードは、新規ギャラリの「Business Tier」カテゴリから使用できます。
セッションBeanを作成する手順は、次のとおりです。
JDeveloperの「ファイル」メニューから、「新規」→「Business Tier」→「EJB」→「セッションBean」の順に選択します。
ウィザードのステップに従って、EJBのバージョン、ステートフル機能とステートレス機能、およびセッション・ファサード・メソッドを指定します。 セッション・ファサード・メソッドの詳細は、第4.4.1.1項「セッション・ファサード・メソッドの生成」を参照してください。
クラス定義ページの「Beanクラス」フィールドで、パッケージを選択します。 パッケージの詳細は、第4.4.1.2項「パッケージの選択」を参照してください。
コンポーネント・インタフェース・ページで、生成するインタフェースを指定します。 インタフェースの詳細は、第4.4.1.3項「リモート、ローカルおよびWebサービスのインタフェース」を参照してください。
ヒント: SOAアプリケーションの場合は、EJB 3.0バージョンのセッションBean、ステートレス・セッションおよびコンテナ管理のトランザクション(CMT)を選択する必要があります。Bean管理のトランザクション(BMT)については、このマニュアルでは説明しません。 |
セッション・ファサードには、エンティティの作成と更新に使用する中核のCRUDメソッド、およびエンティティにアクセスするためのメソッドが含まれています。 セッション・ファサード・メソッドを生成するには、セッションBean作成ウィザードで「セッション・ファサード・メソッドの生成」のチェック・ボックスを選択し、次のページを使用して、生成するメソッドを指定します。 JDeveloperによって、プロジェクト内のすべてのエンティティが自動的に検出されるため、セッション・ファサード・メソッドの作成時に使用するエンティティとメソッドを選択できます。
セッション・ファサード・メソッドは、同じプロジェクト内のすべてのエンティティに対して生成できます。これは、テスト目的の場合は有効ですが、単一のセッションBeanの場合は混乱の原因となる場合があります。 多くの場合、セッションBeanは特定のタスクにあわせてカスタマイズされているため、該当するタスクに必要な情報以外は含まれていません。 生成するメソッドを明示的に選択するには、ツリー・コントロールを使用します。
注意: セッション・ファサード・メソッドは、エンティティ上のすべての名前付き問合せに対して作成できます。 図4-3で、「find」が含まれているメソッドは名前付き問合せです。 名前付き問合せに対してセッション・ファサード・メソッドを生成するときは、そのメソッドの戻り型の指定が必要な場合があります。 リストおよびコレクションに対する戻り型の指定は不要ですが、単一オブジェクトに対しては指定する必要があります。 詳細は、第4.5.3.1項「単一値を戻すメソッドの戻り型の変更方法」を参照してください。 |
大規模なアプリケーションでは、すべてのオブジェクトを同じパッケージ内に配置すると、非常に混乱する可能性があります。 プロジェクトを編成する場合は、複数のオブジェクトを個別のパッケージに分割できます。 たとえば、SOA Order BookingアプリケーションのCustomer Serviceアプリケーションには、ビジネス・サービス(セッションBean)、永続性(JPAエンティティ)およびクライアント(Javaテスト・クライアント)に対して個別のパッケージがあります。 セッションBean、エンティティまたはサンプルのJavaクライアントを作成する場合は、図4-4に示すように、ウィザードまたはダイアログでパッケージ名を変更できます。
必要なインタフェースのタイプは、クライアントによって決まります。 クライアントが同じ仮想マシン(VM)で実行されている場合、通常はローカル・インタフェースが最適です。 クライアントが個別のVMで実行されている場合は、リモート・インタフェースが必要です。 ほとんどのWebアプリケーション(JSF/JSP/サーブレット)では、クライアントとサービスが同じVMで実行されているため、ローカル・インタフェースがベスト・プラクティスです。 Customer Serviceサンプル・アプリケーションでは、すべてが同じVMでローカルに実行されます。 Javaクライアント(ADF Swing)は個別のVMで実行されるため、リモート・インタフェースが必要です。
Webサービスとして使用するステートレス・セッションBeanがある場合は、Webサービス・エンドポイント・インタフェースの生成を選択してください。
セッションBeanクラスには、セッション全体のフィールドとサービス・メソッドが含まれています。 セッションBeanを作成すると、JDeveloperによって、Beanクラスと、ローカルまたはリモート(あるいはその両方)のインタフェースに対する個別のファイルが生成されます。 リモート・インタフェースはセッションBeanの名前(例: CustomerService.java)であるのに対して、BeanクラスにはBean.javaが付加され、ローカル・インタフェースにはLocal.javaが付加されます。
注意: インタフェース・ファイルは直接変更する必要がないため、アプリケーション・ナビゲータには表示されません。 インタフェース・ファイルを表示するには、システム・ナビゲータまたは構造ペインを使用します。 |
例4-3 CustomerServiceBean.java Beanクラス
package org.soademo.customerservice.business; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.soademo.customerservice.persistence.Customer; @Stateless(name = "CustomerService") public class CustomerServiceBean implements CustomerService, CustomerServiceLocal { @PersistenceContext(unitName = "customerServiceUnit" ) private EntityManager em; public CustomerServiceBean() { } public Object mergeEntity(Object entity) { return em.merge(entity); } public Object persistEntity(Object entity) { em.persist(entity); return entity; } public Object refreshEntity(Object entity) { em.refresh(entity); return entity; } public void removeEntity(Object entity) { em.remove(em.merge(entity)); } /** <code>select object(cust) from Customer cust where cust.custid = :custid</code> */ public Customer queryCustomerFindCustomerById(String custid) { return (Customer)em.createNamedQuery("Customer.findCustomerById").setParameter("custid", custid).getSingleResult(); } public String getCustomerStatus(String CustomerID) { return findCustomerById(CustomerID).getStatus(); } public String addNewCustomer(Customer customer) { em.persist(customer); return "New customer added sucessfully to customer database"; } public Customer findCustomerByEmail(String email, String password) { return (Customer)em.createNamedQuery("Customer.findCustomerByEmail").setParameter("email", email).setParameter("password", password).getSingleResult(); } }
通常、セッション・ファサードは、アプリケーション内の論理ユニットごとに1つ作成します。 論理ユニットは、アプリケーション内のスコープ別に定義される場合があります。 たとえば、管理クライアント操作に対して1つのセッション・ファサードを作成し、顧客クライアント操作に対して別のセッション・ファサードを作成します。 セッション・ファサードの作成方法と名前の設定方法によってUI開発が簡素化される可能性があるため、特定のタスクにあわせてセッション・ファサードをカスタマイズし、タスクを説明する名前を使用することをお薦めします。
新規セッションBeanは、ウィザードを使用していつでも作成できます。 しかし、カスタムの実装コードがすでに含まれている既存のセッションBeanがあり、このセッションBeanを新規永続データ・オブジェクトまたはメソッドを使用して更新する場合があります。
新規エンティティを使用して既存のセッションBeanを更新する手順は、次のとおりです。
ナビゲータで、セッションBeanを右クリックし、「セッション・ファサードの編集」を選択します。
「セッション・ファサード・オプション」ダイアログを使用して、公開するエンティティおよびメソッドを選択します。
セッションBeanおよびエンティティを作成した後で、セッションBeanに追加メソッドを作成する場合があります。
メソッドを作成する最も簡単な方法は、「Beanメソッドの詳細」ダイアログを使用することです。 このダイアログを開くには、ナビゲータでセッションBeanを選択し、図4-5に示すように、「構造」ペインで「メソッド」フォルダを右クリックします。
図4-6に示すように、「Beanメソッドの詳細」ダイアログを使用して、各種詳細を指定します。
メソッドを作成した後は、ソース・ファイル(Beanクラス)に移動し、実装コードを追加する必要があります。 たとえば、SOA Order Bookingアプリケーションでは、顧客のステータスを取得するために次のコードが使用されています。