エンタプライズBeanのクライアントビューは,コンテナが実装するクラスによって提供されるが, コンテナ自体は,クライアントに透過的とする。
クライアントは,セションBeanの遠隔インタフェースを通じて,セションエンタプライズBeanにアクセスする。 この遠隔インタフェースを実装するオブジェクトを,EJBオブジェクトと呼ぶ。EJBオブジェクトは, 遠隔Javaプログラム言語オブジェクトであって,遠隔オブジェクト呼出しのための標準JavaAPI[3]によって, クライアントからアクセスできる。
EJBオブジェクトは,生成から破壊まで,コンテナで生存する。クライアントには透過的だが,そのコンテナは,セキュリティ,並行処理, トランザクション,二次記憶装置へのスワッピングなどのサービスを,EJBオブジェクトに提供する。
各セションEJBオブジェクトは識別子をもつが,一般にコンテナのクラッシュ及び再始動を生き延びることはできないが, 高機能コンテナ実装では,クライアントに対し,コンテナ及びサーバのクラッシュを隠すことができる。
EJBオブジェクトに関するクライアントのビューは,記憶場所独立とする。EJBオブジェクトと同じJVMで実行するクライアントは, 計算機の同異にかかわらず異なるJVMで実行するクライアントと,同じAPIを使用する。
複数のEJBクラスをコンテナにインストールできる。コンテナは,クライアントのJNDIを通じて, インストール済みEJBクラスのホームインタフェースの参照を可能とする。各ホームインタフェースは, 対応EJBクラスのEJBオブジェクト生成及び除去のメソッドを提供する。
EJBオブジェクトに関するクライアントのビューは,エンタプライズBean及びそのコンテナの実装に関係なく,同じとする。
コンテナは,データベースでのレコード及びファイルシステムでのファイル又はディレクトリと同様に, エンタプライズBeanオブジェクトの生存する場所とする。
Context initialContext = new InitialContext(); CartHome cartHome = javax.rmi.PortableRemoteObject.narrow( initialContext.lookup("applications/mall/freds-carts"), CartHome.class);クライアントのJNDI名前空間は,EJBクラスのホームインタフェースを含むとおりに構成され,EJBクラスは, ネットワーク上の複数の計算機に置かれた複数のEJBコンテナにインストールされる。EJBクラス及びEJBコンテナの実際の位置は, 一般にクライアントに透過的とする。
![]() |
次の例は,単一メソッドcreate()を定義するホームインタフェースを表す。
public interface CartHome extends javax.ejb.EJBHome{ Cart create(String customerName, String account) throws RemoteException, BadAccountException, CreateException; }次の例は,クライアントがインタフェースCartHomeのメソッドcreate()を使用して, 新しいEJBオブジェクトを生成する方法を示す。
cartHome.create("John", "7506");
EJBオブジェクトは,次をサポートする。
すべてのセションオブジェクトは,識別性を隠ぺいするので,セションオブジェクトにinder()を提供する必要はない。 セションオブジェクトのホームインタフェースは,メソッドfinder()を定義してはならない。
セションEJBオブジェクトハンドルは,永続的な記憶に直列化することによって,クライアントプロセスの寿命を越えて維持される。 ハンドルが後で非直列化されると,返されるセションEJBオブジェクトは,そのオブジェクトがサーバ上に存在する限り,作動する (タイムアウト又はサーバクラッシュがその前に生じた場合には,破壊されるかもしれない。)。
![]() |
EJBオブジェクトは,生成されるまでは存在しない。オブジェクトがクライアントによって生成されると, クライアントは,新たに生成されたEJBオブジェクトへの参照を獲得する。
オブジェクトへの参照をもつクライアントは,次を実行できる。
![]() |
クライアントは,Cartのホームインタフェースのメソッドcreate()を用いて,(ショッピングサービスを提供する) Cartセションオブジェクトを生成する。クライアントは,その後,このオブジェクトを使用して,買い物かごに商品を入れ,購入する。
クライアントがショッピングセションを作業マシンで開始し,後でホームマシンからこのセションを完了したい場合には, セションのハンドルを獲得し,ハンドルを直列化して自分のホームマシンに転送し,それを用いて元のCartへのアクセスを再確立すればよい。
JNDIのCartホームインタフェースを参照することから開始する例を,次に示す。この後で,ホームインタフェースを使用して, Cart EJBオブジェクトを生成し,商品を追加する。
CartHome cartHome = javax.rmi.PortableRemoteObject.narrow( initialContext.lookup(...), CartHome.class); Cart cart = cartHome.create(...); cart.addItem(66); cart.addItem(22);次に,このショッピングセションをホームで完了することにし,この買い物かごのセションへのハンドルを直列化して,ホームへメールする。
Handle cartHandle = cart.getHandle(); serialize cartHandle, attach to message and mail it home...最後に,ホームでハンドルを戻して,買い物かごの中身を購入する。
Handle cartHandle = deserialize from mail attachment... Cart cart = (Cart) cartHandle.getEJBObject(); cart.purchase(); cart.remove();