一般的なデザインパターンには、セッション bean によるすべてのエンティティ bean アクセスのルーティングが含まれます。EJB クライアントは、セッション bean でメソッドを呼び出し、セッション bean は、必要に応じて、メソッドを 1 つ以上のエンティティ bean メソッドに転送します。これは、セッションエンティティファサードと呼びます。
セッションエンティティファサードのデザインパターンには、セッションエンティティ bean 通信にローカルアクセスを使用することによるパフォーマンスの簡略化など、多くの利点があります。
この例では、 「BMP エンティティ bean」 に示すエンティティ bean でメソッドを呼び出すセッション bean を示します。ただし、デプロイメントディスクリプタは示しません。
次のコードは、セッション bean ファサードで使用するステートレスセッション bean のリモートホームインターフェイスを示しています。
package compass;
public interface BalanceHome extends EJBHome { public ReservationRemote create() throws java.rmi.RemoteException, javax.ejb.CreateException; }
次のコードは、セッションエンティティ bean ファサードで使用するステートレスセッション bean のリモートコンポーネントインターフェイスを示しています。
package compass;
public interface ReservationRemote extends javax.ejb.EJBObject { public int reserve(String custId, int tripId, double amount, String ccType, String ccNumber, String ccExpiration) throws java.rmi.RemoteException; }
セッションエンティティファサードのセッション bean 実装は、エンティティ bean を検索し、ビジネスロジックの必要に応じてそのメソッドを呼び出します。
次のコードは、エンティティ bean を呼び出して予約処理の一部として予約内容を作成するセッション bean の bean 実装を示しています。
package compass;
import javax.ejb.*; public class ReservationBean implements SessionBean { ... public int reserve(String custId, int tripId, double amount, String ccType, String ccNumber, String ccExpiration) { int orderId=0; // InitialContext をインスタンス化します javax.naming.InitialContext ctx=null; try { ctx = new javax.naming.InitialContext(); } catch (Exception e) { log(e); } ... // エンティティ bean の create メソッドを呼び出すことによって、 新規の予約内容を作成します。 try { Object obj = ctx.lookup("Order"); // この例で、ローカルインターフェイスを使用することもできます。 OrderHomeRemote home = (OrderHomeRemote)javax.rmi.PortableRemoteObject.narrow(obj, OrderHomeRemote.class); OrderRemote order = home.create(custId, tripId, ccType, ccNumber, ccExpiration); orderId = order.getOrderId(); log("Order created:"+orderId); } catch (Exception e) { } ... return orderId; ...
次の JSP 例は、セッションエンティティファサードへのクライアントアクセスを示しています。
<%@ page import="compass.*" %>
<jsp:useBean id="trip" scope="session" class="compass.TripBean"/> <html> <head> <title>確認</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" href="master.css" type="text/css"> </head> <body> <%@ include file="header.jsp"%> <br> <img src="images/tripConfirmation.gif"> <br><br> <jsp:include page="tripsummary.jsp" flush="true"/> <br> <% String type = request.getParameter("type"); String number = request.getParameter("number"); String expiration = request.getParameter("expiration"); String userId = (String) session.getAttribute("userId"); int tripId = trip.getTripId(); double price = trip.getPrice(); try { javax.naming.InitialContext ctx = new javax.naming.InitialContext(); Object obj = ctx.lookup("Reservation"); ReservationHomeRemote home = (ReservationHomeRemote)javax.rmi.PortableRemoteObject.narrow obj, ReservationHomeRemote.class); ReservationRemote reservation = home.create(); int id = reservation.reserve(userId, tripId, price, type, number, expiration); %> ありがとうございます。予約内容が確認されました。<br><br> 予約番号:<%= id %> <br> <% } catch (Exception e) { %> 申し訳ありません。この旅行は予約できませんでした。 <br><%= e.getMessage() %> <% } %> <%@ include file="footer.htm"%> </body> </html>