目次 | 前
| 次
9. 実体Bean部品契約
備考:実体エンタプライズBeansに対するコンテナサポートは,EJB1.0ではオプションだが,
EJB2.0では必須となるだろう。
実体Bean部品契約は,実体Beanとそのコンテナとの間の契約とする。 この契約は,実体Beanインスタンスのライフサイクル及びクライアント呼出し業務メソッドのメソッド委託のモデルを定義する。
この契約の主な目標は,この規定に準拠したEJBコンテナのすべてに渡って,確実に部品が移植可能となることにある。
9.では,この契約のエンタプライズBean開発者のビュー及び部品のライフサイクルを管理するコンテナの責任を定義する。
9.1 実行時実行モデル
9.1では,実行時モデル,及び実体エンタプライズBeanとそのコンテナとの間の契約の記述で使用されるクラスについて述べる。
 |
図9.1 エンタプライズBeanインスタンス,EJBオブジェクト及びEJBホームの関係
エンタプライズBeanインタフェースは,そのクラスをエンタプライズBean開発者が提供するオブジェクトとする。
EJBオブジェクトは,コンテナ提供者のツールがそのクラスを配置時に生成するオブジェクトとする。
EJBオブジェクトクラスは,エンタプライズBeanの遠隔インタフェースを定義する。
クライアントは,直接にはエンタプライズBeanインスタンスを参照することはない。クライアントは常に,
コンテナがその実装を提供するEJBオブジェクトを参照する。
EJBホームオブジェクトは,そのEJBオブジェクトに対するライフサイクル操作(生成,除去及び検出)を提供する。
EJBホームオブジェクトのクラスは,配置時にコンテナ提供者のツールによって生成されたものとする。
ホームオブジェクトは,EJB提供者が定義したエンタプライズBeanのホームインタフェースを実装する。
9.2 実体永続性
実体エンタプライズBeanは,使用中のデータベースに記憶された実体のオブジェクトビュー,又は
(例えば,メインフレームプログラム又はパッケージアプリケーションによる)
既存の業務用アプリケーションによって実装された実体を実装する。エンタプライズBeanインスタンスのインスタンス変数と
使用中のデータベースとの間の実体の状態を転送するプロトコルを,オブジェクト永続性として参照する。
実体部品プロトコルによって,エンタプライズBean提供者は,エンタプライズBeanクラスにおいて,
直接にエンタプライズBeanの永続性を実装する(これを,Bean管理永続性と呼ぶ。)か,
又はエンタプライズBeanの永続性をコンテナに委託する(これを,コンテナ管理永続性と呼ぶ。)かのいずれかが可能になる。
使用中のデータソースは,データベースというよりもむしろ既存のアプリケーションとなる場合が多いかもしれない。
 |
(a) 実体ビーンがデータベース内のレコードのオブジェクトビューの場合。 |
 |
(b) 実体ビーンが既存のアプリケーションのオブジェクトビューの場合。 |
図9.2 実体ビーンに対するオブジェクトビューの種類
9.2.1 Bean管理永続性
Bean管理の場合,エンタプライズBean提供者は,(例えば,JDBCTM又はJSQLを使用して,)
データベースアクセス呼出しを,直接にエンタプライズBeanクラスのメソッド内に書く。データベースアクセス呼出しは,
エンタプライズBean呼戻しメソッド,ejbCreate(),ejbRemove(),ejbFind<METHOD>(),
ejbLoad()及びejbStore()で実行する。
Bean管理永続性を使用する利点は,コンテナがエンタプライズBeanの永続性を実装するデータベース呼出しを生成する必要なしに,
エンタプライズBeanをコンテナにインストールできることにある。主な欠点は,永続性がエンタプライズBeanクラスに
コードレベルで組み込まれ,それによって,エンタプライズBeanを異なるデータソースに適合させるのが困難になることにある。
9.2.2 コンテナ管理永続性
コンテナ管理の場合,Bean開発者は,エンタプライズBeanにデータベースアクセスを書かない。
代わりに,コンテナ提供者のツールが,エンタプライズBeanの配置時 (つまり,エンタプライズBeanクラスがコンテナにインストールされる時)に,データベースアクセス呼出しを生成する。
エンタプライズBean提供者は,配置記述子特性containerManagedFieldsを指定し,
コンテナ提供者ツールがアクセス呼出しを生成しなければならないインスタンスフィールドのリストを指定しなければならない。
コンテナ管理永続性を使用する利点は,エンタプライズBeanクラスが,実体を記憶するデータソースから独立することにある。
コンテナツールは,JDBC又はJSQLを使用して関係データベース内の実体状態にアクセスするクラス,
IMSデータベースなどの関係データベースではないデータソースへのアクセスを実装するクラス,
又は既存の業務用アプリケーションへの関数呼出しを実装するクラスを生成できる。
欠点は,エンタプライズBeanのフィールドをデータソースに写像するために,
高機能ツールを配置時に使用しなければならないことにある。これらのツール及びコンテナは,通常は
各データソースに固有となる。
9.3 インスタンスライフサイクル
図9.3は,エンタプライズBeanのインスタンスのライフサイクルを例示する。
 |
図9.3 エンタプライズBeanインスタンスのライフサイクル
インスタンスは,次の三つの状態の一つとする。
-
インスタンスは存在しない。
-
プールされた状態。プールされた状態でのインスタンスは,特定のEJBオブジェクト識別性と関連付けられない。
-
動作可能状態。動作可能状態でのインスタンスは,EJBオブジェクトに割り当てられる。
実体エンタプライズBeanインスタンスのライフサイクルの主要な流れを次に示す。
-
エンタプライズBeanのインスタンスの寿命は,コンテナがnewInstance()
を使用してインスタンスを生成するときに始まる。その後コンテナは,メソッドsetEntityContext()を呼び出し,
インスタンスを実体文脈インタフェースへの参照に渡す。実体文脈オブジェクトによって,インスタンスは,
コンテナが提供するサービスを呼び出し,クライアント呼出しメソッドの呼出し側に関する情報を獲得することができる。
参考:メソッドsetEntityContext()において,コンテナによってインスタンスに渡される実体文脈は
インタフェースであって,静的情報を含むクラスではない。例えば,メソッドgetPrimaryKey()の結果は,
プールされた状態から動作可能状態へとインスタンスが遷移する度に,異なるかもしれない。
-
インスタンスは,エンタプライズBeanクラスの利用可能なインスタンスのプールへと入る。
利用可能なプールに存在する間,インスタンスは,特定のEJBオブジェクトの識別性と関連付けられることはない。
プールの中のインスタンスはすべて等価であって,そのために,動作可能状態への遷移時に,
コンテナは,プールの中のインスタンスを任意のEJBオブジェクトに割り当てることができる。
インスタンスがプールされた状態にある間,コンテナは,そのインスタンスを使用してエンタプライズBeanのメソッド
finder()のいずれかを実行するかもしれない。これは,図9.3では,ejbFind<METHOD>()として示されている。
-
適正なトランザクション文脈において,そのインスタンスが動作可能状態にないEJBオブジェクト上のクライアント呼出しを,
コンテナが行う場合には,インスタンスが,プールされた状態から動作可能状態へ移行する。
プールされた状態から動作可能状態への可能な遷移は,2通り存在する。一つは,メソッドejbCreate()
及びメソッドejbPostCreate()を通じての遷移,もう一つは,メソッドejbActivate()を通じての遷移とする。
EJBオブジェクトの生成中(つまり,クライアントがBeanのホームオブジェクト上で生成メソッドを呼び出す場合)に,
インスタンスがEJBオブジェクトに割り当てられる場合には,コンテナは,メソッドejbCreate()
及びメソッドejbPostCreate()を呼び出す。既存のEJBオブジェクト上での呼出しを提供するために,
インスタンスを活性化する必要がある場合には,コンテナは,インスタンス上でメソッドejbActivate()を呼び出す。
-
エンタプライズBeanインスタンスが動作可能状態にある場合,インスタンスは,固有のEJBオブジェクトと関連付けられる。
インスタンスが動作可能状態にある間,コンテナはいつでもゼロ以上の回数,メソッドejbLoad()
及びメソッドejbStore()を呼び出せる。業務メソッドは,インスタンス上でゼロ以上の回数,呼び出せる。
メソッドejbLoad()及びメソッドejbStore()の呼出しは,業務メソッドの呼出しと任意に混合できる。
メソッドejbLoad()及びメソッドejbStore()の目的は, インスタンスの状態と使用中のデータソースでの実体の状態との同期をとることにある。
-
最終的に,コンテナはインスタンスをプールされた状態へと遷移させる。動作可能状態からプールされた状態への可能な遷移は,2通り存在する。
一つは,メソッドejbPassivate()を通じての遷移,もう一つは,メソッドejbRemove()を通じての遷移とする。
EJBオブジェクトを除去せずに,EJBオブジェクトからのインスタンスとの関連をなくしたい場合には,
コンテナは,メソッドejbPassivate()を呼び出す。コンテナがEJBオブジェクトを除去している場合
(つまり,クライアントが,EJBオブジェクト上でメソッドremove()を呼び出す,
又はエンタプライズBeanのホームインタフェース上でいくつかのメソッドremove()の一つを呼び出す場合)には,
コンテナは,メソッドejbRemove()を呼び出す。
-
インスタンスがプールに戻された場合,そのインスタンスは,もはやEJBオブジェクトの識別性とは関連をもたない。
コンテナは,同じエンタプライズBeanクラスのEJBオブジェクトのいずれにも,インスタンスを割り当てることができる。
-
インスタンス上でメソッドunsetEntityContext()を呼び出すことによって,
プールされた状態のインスタンスを除去できる。Javaアプリケーション環境実行時は,最終的にインスタンス上でメソッド
finalize()を呼び出すことになる。
備考:メソッドsetEntityContext()でコンテナがインスタンスに渡す実体文脈は,インタフェースであって,
静的情報を含むクラスではない。例えば,メソッドgetPrimaryKey()の結果は,
インスタンスがプールされた状態から動作可能状態へと移動する度に違ってもよい。
9.4 実体Bean部品契約
9.4では,実体Beanとそのコンテナとの間の契約を規定する。契約は,ここではBean管理永続性を仮定して規定する。
コンテナ管理永続性に対する契約との相違は,9.10で定義する。
9.4.1 エンタプライズBeanインスタンスのビュー
契約における,エンタプライズBeanインスタンスの側面を示す。
エンタプライズBeanは,エンタプライズBeanメソッドにおいて,次の機能を実装する責任をもつ。
-
public void setEntiteyContext(EntityContext ic);
コンテナはこのメソッドを使用して,エンタプライズBeanインスタンスに対するインタフェースEntityContext
への参照を渡す。エンタプライズBeanインスタンスが,その寿命の間に実体文脈を使用する必要がある場合,
インスタンス変数における実体文脈を記憶しなければならない。
このメソッドを,どのトランザクション文脈で呼び出すかは規定しない。EJBオブジェクトの識別性は,
このメソッドの実行中には,利用可能ではない。
インスタンスは,メソッドsetEntityContext(ic)を利用して,インスタンスがその寿命の間に保持することになる
任意の資源を割り付ける。インスタンスは,複数のEJBオブジェクトに役立つものとして,
その寿命の間に再利用されるかもしれないので,割り当てられた資源は,EJBオブジェクト識別性に固有ではない。
-
public void unsetEntityContext(EntityContext ic);
コンテナは,インスタンスの一生を終了させる前に,このメソッドを呼び出す。
このメソッドを,どのトランザクション文脈で呼び出すかは規定しない。EJBオブジェクトの識別性は,
このメソッドの実行中には,利用可能ではない。
インスタンスは,メソッドunsetEntityContext(ec)を利用して,インスタンスが保持する任意の資源を解放する。
これらの資源は,通常は,メソッドsetEntityContext()によって割り付けられた。
-
public void ejbCreate();
ゼロ個以上のメソッドejbCreate()が存在し,そのシグネチャは,
エンタプライズBeanのホームインタフェースのメソッドcreate()のシグネチャと一致する。
クライアントが一致する機能create()を呼び出す場合,コンテナは, エンタプライズBeanインスタンス上でメソッドejbCreate()を呼び出す。
参考:実体エンタプライズBeanがそのホームインタフェースでのメソッドcreate()を定義しない場合,
メソッドejbCreate()及びメソッドejbPostCreate()をもたない。この実体エンタプライズBeanによって,
クライアントは,新しいEJBオブジェクトを生成できなくなる。エンタプライズBeanは,クライアントが,
直接的なデータベースの挿入を通じて生成された実体にアクセスすることを制限する。
メソッドejbCreate()の実装は,通常は,クライアントが提供する実引数を有効にし,
実体を表現するレコードをデータベースに挿入する。メソッドは,インスタンスの変数も初期化する。
メソッドejbCreate()は,生成された実体に対応する1次キーを返さなければならない。
メソッドejbCreate()は,適正なトランザクション文脈で実行される。
-
public void ejbPostCreate();
各メソッドejbCreate()に対して,同じ入力仮引数をもつが返却値の型はvoidとなる一致するメソッド
ejbPostCreate()が存在する。コンテナは,メソッドejbCreate()を呼び出した後で,
同じ引数をもつメソッドと一致するejbPostCreate()を呼び出す。メソッドejbPostCreate()の実行中,
EJBオブジェクト識別性は利用可能とする。例えば,インスタンスは,それ自体のEJBオブジェクト参照を,
別のEJBオブジェクトにメソッド引数として渡してもよい。
メソッドejbPostCreate()は,適正なトランザクション文脈で実行する。
-
public void ejbActivate();
コンテナがプールからインスタンスを選択し,それを特定のEJBオブジェクト識別性に割り当てる場合に,
そのインスタンス上でこのメソッドを呼び出す。メソッドejbActivate()は,エンタプライズBeanインスタンスに,
動作可能状態に存在する間に必要とする付加的な資源を獲得する機会を与える。
このメソッドは,無指定のトランザクション文脈で実行する。インスタンスは,実体文脈上のメソッド
getPrimaryKey()又はメソッドgetEJBObject()を通じて,EJBオブジェクトの識別を獲得できる。
インスタンスは,1次キー及びEJBオブジェクト識別性が,ejbPassivate()又はejbRemove()
の完了までそのインスタンスと関連付けられたままでいることに依存できる。
インスタンスは,メソッドejbActivate()を使用して, データベースから実体の状態を読まないほうがよいことに注意。インスタンスは,メソッドejbLoad()でだけ,
その状態を復帰するのが望ましい。
-
public void ejbPassivate();
コンテナが,インスタンスとEJBオブジェクト識別性との関連をはずし, そのインスタンスを利用可能なインスタンスのプールへと戻すと決断した場合に,コンテナは,
そのインスタンス上でこのメソッドを呼び出す。メソッドejbPassivate()は,エンタプライズBeanに,
インスタンスがプール内に存在する間に保持しないほうがよい資源を解放する機会を与える。
これらの資源は,通常は,メソッドejbActivate()の実行中に割り付けられた。
このメソッドは,無指定のトランザクション文脈で実行される。インスタンスは,実体文脈上のメソッド
getPrimaryKey()又はメソッドgetEJBObject()を通じてならば,
まだEJBオブジェクトの識別性を獲得できる。
インスタンスは,メソッドejbPassivate()を使用して,その状態をデータベースに書かないほうがよいことに注意。
インスタンスは,メソッドejbStore()でだけ,その状態を記憶することが望ましい。
-
public void ejbRemove();
クライアントが除去メソッドを呼び出す結果として,コンテナは,インスタンス上でこのメソッドを呼び出す。
ejbRemove()が呼び出される場合には,インスタンスは動作可能状態にあり,
メソッドが完了するとプールに入れられる。
このメソッドは,クライアントのメソッドremove()の実効的なトランザクション文脈内で実行される。
インスタンスは,実体文脈上のメソッドgetPrimaryKey()又はメソッドgetEJBObject()を通じてならば,
まだEJBオブジェクトの識別性を獲得できる。
エンタプライズBeanインスタンスは,このメソッドを使用して,データベースの中の実体表現を除去することが望ましい。
インスタンスがプールに入れられるので,このメソッドの終了におけるインスタンスの状態は,
非活性化されたインスタンスの状態と等価でなければならない。このことは,インスタンスが通常はメソッド
ejbPassivate()で解放する資源のすべてを,解放しなければならないことを意味する。
-
public void ejbLoad();
コンテナは,動作可能状態のインスタンス上でこのメソッドを呼び出し,インスタンスに,
インスタンスがデータベース内の実体状態からのインスタンス変数と同期をとらなければならないと助言する。
インスタンスが動作可能状態にいるときはいつでも,インスタンスは,コンテナがこのメソッドを呼び出せるように
準備をしておかなければならない。
インスタンスは,データベースから実体状態を読むことによって,メソッドejbLoad()で,
その状態を最新のものとすることが望ましい。
このメソッドは,適正なトランザクション文脈で実行される。
-
public void ejbStore();
コンテナは,インスタンス上でこのメソッドを呼び出し,インスタンスに,
インスタンスがそのインスタンス変数をもつデータベース内の実体状態と同期をとらなければならないと助言する。
インスタンスが動作可能状態にいるときはいつでも,インスタンスは,コンテナがこのメソッドを呼び出せるように
準備をしておかなければならない。
インスタンスは,その状態をメソッドejbStore()でデータベースに書くことが望ましい。
このメソッドは,適正なトランザクション文脈で実行される。
-
public 1次キーの型又はその集まり ejbFind<METHOD>();
コンテナがインスタンスを選択して一致するクライアント呼出しのメソッドfind<METHOD>()を実行する場合,
コンテナは,そのインスタンス上でこのメソッドを呼び出す。コンテナがインスタンスを選択し,
そのインスタンス上でメソッドejbFind<METHOD>()を実行するとき,インスタンスはプールされた状態
(つまり,特定のEJBオブジェクト識別性に割り当てられていない。)にあり,メソッドejbFind<METHOD>
の実行が完了するとき,プールされた状態に戻される。
メソッドejbFind<METHOD>()は,適正なトランザクション文脈で実行される。
メソッドejbFind<METHOD>()の実装は,メソッドの引数を使用して,
要求されたオブジェクト又はオブジェクトの集まりをデータベース内で位置決めすることが望ましい。
メソッドは,1次キー又は1次キーの集まりを,コンテナに返さなければならない。
9.4.2 コンテナのビュー
次は,状態管理契約のコンテナ側とする。コンテナは,ここに示すとおりに,次のメソッドを呼び出さなければならない。
-
public void setEntityContext(ec);
コンテナは,このメソッドを呼び出して,エンタプライズBeanの実体文脈への参照をエンタプライズBeanに渡す。
コンテナは,インスタンスを生成した後及びそのインスタンスを利用可能なインスタンスのプールに入れる前に,
このメソッドを呼び出さなければならない。
コンテナが,このメソッドをトランザクション文脈の内部で呼び出すか,又は外部で呼び出すかは,重要ではない。
この時点で,実体文脈は,いかなるEJBオブジェクトとも関連付けられない。
-
public void unsetEntityContext();
コンテナが,プール内のインスタンスの数を減らしたい場合に,このメソッドを呼び出す。
このメソッドの完了後,コンテナは,このインスタンスを再利用できない。そこで,
インスタンスへの参照をすべてはずし,Javaプログラム言語ガーベジコレクタが,
最終的にそのインスタンス上のメソッドfinalize()を呼び出せることが望ましい。
コンテナが,このメソッドをトランザクション文脈の内部で呼び出すか,又は外部で呼び出すかは,重要ではない。
-
public void ejbPostCreate();
コンテナは,エンタプライズBeanのEJBホーム上のメソッドcreate()をクライアントが呼び出した結果としての
EJB実体オブジェクトの生成中に,これら二つのメソッドを呼び出す。
コンテナは,最初に,そのシグネチャがクライアントによって呼び出されたメソッドcreate()と一致するメソッド
ejbCreate()を呼び出す。メソッドejbCreate()は,生成された実体に対する1次キーを返す。
コンテナは,1次キーに対するEJBオブジェクト参照を生成する。次に,コンテナは,インスタンスが完全に初期化できる
ために一致するメソッドejbPostcreate()を呼び出す。最後に,コンテナは,
EJBオブジェクト参照をクライアントに返す。
コンテナは,適正なトランザクション文脈で,このメソッドを呼び出さなければならない。
-
public void ejbActivate();
コンテナは,活性化時(つまり,インスタンスがプールから取り出され,EJBオブジェクトに割り当てられる時)に,
エンタプライズBeanインスタンス上のこのメソッドを呼び出す。コンテナは,インスタンスがその実体文脈上でメソッド
getPrimaryKey()又はメソッドgetEJBObject()を呼び出す場合には,
関連するEJBオブジェクトの1次キーが,インスタンスに確実に利用可能としなければならない。
コンテナは,このメソッドをトランザクション文脈の内部又は外部で呼び出してよい。
インスタンスは,業務メソッドの配布に対しては,まだ準備ができていないことに注意。
コンテナは,この場合でも,業務メソッドに先行してメソッドejbLoad()を呼び出さなければならない。
-
public void ejbPassivate();
コンテナは,非活性化時(つまり,インスタンスをEJBオブジェクトとの関連からはずし,プールへと移動する時)に,
エンタプライズBeanインスタンス上でこのメソッドを呼び出す。コンテナは,インスタンスが実体文脈上でメソッド
getPrimaryKey()又はメソッドgetEJBObject()を呼び出す場合には,
関連するEJBオブジェクトの1次キーが,インスタンスに対してまだ確実に利用可能としなければならない。
コンテナは,このメソッドをトランザクション文脈の内部又は外部で呼び出してよい。
インスタンス状態がトランザクションによって更新された場合には,コンテナは,インスタンス上で
ejbPassivate()を呼び出す前に,まずそのインスタンス上でメソッドejbStore()
を呼び出さなければならない。
-
public void ejbRomove();
コンテナは,クライアントが除去操作を呼び出した結果として,EJBオブジェクトの一生を終了する前に,
このメソッドを呼び出す。
コンテナは,クライアントのメソッドremove()のトランザクション文脈で,このメソッドを呼び出す。
インスタンスが実体文脈上でメソッドgetPrimaryKey()又はメソッドgetEJBObject()を呼び出す場合には,
コンテナは,関連するEJBオブジェクトの1次キーが,インスタンスに対してまだ確実に利用可能としなければならない。
-
public void ejbLoad();
コンテナは,インスタンスがインスタンスの状態をデータベースのコンテナの状態から同期する必要を生じた場合はいつでも,
インスタンス上でこのメソッドを呼び出さなければならない。
コンテナは,適正なトランザクション文脈でこのメソッドを呼び出す。
-
public void ejbStore();
コンテナは,インスタンスがデータベースの状態をインスタンスのフィールドの状態と同期する必要を生じた場合はいつでも,
インスタンス上でこのメソッドを呼び出さなければならない。
コンテナは,適正なトランザクション文脈でこのメソッドを呼び出す。
-
public 1次キーの型又はその集まり ejbFind<METHOD>();
クライアントが,エンタプライズBeanのホームインタフェース上で一致するメソッドfind<METHOD>()を呼び出す場合,
コンテナは,インスタンス上でメソッドejbFind<METHOD>()を呼び出す。コンテナは,メソッド
ejbFind<METHOD>()を実行するために,プールされた状態(つまり,インスタンスがいかなる
EJBオブジェクトとも関連付いていない状態)にあるインスタンスを選択しなければならない。
コンテナは,適正なトランザクション文脈で,メソッドejbFind<METHOD>()を呼び出さなければならない。
メソッドejbFind<METHOD>()が一つの1次キーを返すと宣言される場合,コンテナは,
1次キーのEJBオブジェクト参照を生成し,それをクライアントに返す。メソッドejbFind<METHOD>()
が1次キーの集まりを返すとを宣言されている場合,コンテナは,ejbFind<METHOD>()
から返された1次キーに対するEJBオブジェクトの集まりを生成し,その集まりをクライアントに返す。
9.5 複数トランザクションからの並行アクセス
エンタプライズBean開発者は,業務メソッドを書く場合に,複数のトランザクションからの並行アクセスについて考慮する
必要はない。エンタプライズBean開発者は,コンテナが,複数トランザクションから並行的にアクセスされる実体Bean
に対する適切な同期を確実に行うと仮定して,メソッドを書く。
実体コンテナは,通常は,二つの実装方式の内の一つを使用して,適正な同期を達成する。ただし,これらの方式は,
説明であって規定ではない。
-
コンテナは,エンタプライズBeanの複数インスタンスを,実体がアクセスされている各トランザクションごとに一つ,
活性化する。トランザクションの同期は,メソッドejbLoad(),メソッドejbCreate(),
メソッドejbStore()及びメソッドejbRemove()が実行するデータベースアクセス呼出しの間,
使用中のデータベースによって自動的に実行される。データベースシステムは,
必要なトランザクション同期化をすべて提供し,コンテナは,同期論理を実行する必要はない。
9.11.4におけるコミット時オプションB及びCは,この型のコンテナに適用できる。
 |
図9.4 データベースシステムレベルでの同期
-
コンテナは,データベースのインスタンスの状態で排他ロックを獲得する。コンテナは,単一のインスタンスを活性化し,
複数のトランザクションからのこのインスタンスへのアクセスを直列化する。9.11.4のコミット時オプションAは,
この型のコンテナに適用できる。
 |
図9.5 コンテナレベルでの同期
9.6 再入不可能インスタンス及び再入可能インスタンス
デフォルトとして,実体Beanインスタンスは,再入可能ではない。インスタンスが,与えられたトランザクション文脈での
クライアント要求を実行し,同じトランザクション文脈をもつ他の要求がEJBオブジェクトに到着した場合,
コンテナは,2番目の要求にjava.rmi.RemoteExceptionを投げることになる。この規則によって,Bean開発者は,
単一スレッドで再入不可能なコードとしてBeanをプログラムできる。
実体Beansの機能の中には,同じトランザクション文脈でループバックを要求するものがあるかもしれない。ここで,
ループバックとは,例えば,クライアントがBeanAを呼び出し,AがBeanBを呼び出し,さらにBがAを呼び戻す場合などをいう。
Beanの配置記述子がBeanは再入可能であると指定する場合に,コンテナはループバックを可能とする。
ループバックによって呼び出されるBeanのメソッドは,(トランザクション文脈及びセキュリティ文脈を含む)現在の実行文脈を,
クライアントが呼び出すBeanのメソッドと共有する。
再入可能なBeansは,特に慎重に,プログラムし使用しなければならない。
まず,Beanプログラマは,ループバック呼出しを念頭においた上で,Beanをコード化しなければならない。
次に,コンテナは,一般には,異なるクライアントの並行呼出しからのループバックを知らせることはできないので,
クライアントプログラマは,同じトランザクション文脈における並行呼出しを導けるコードを避ける注意をしなければならない。
同じEJBオブジェクトを目指す同じトランザクション文脈での並行呼出しは不正とする。予期できない結果を招くかもしれない。
コンテナは,一般には,不正な並行呼出しと正当なループバックとを区別できないので,アプリケーションプログラマは,
ループバックの使用を避けることが望ましい。コールバックを必要としない実体Beansは,配置記述子で再入不可能として
印を付けることができるので,コンテナは,クライアントからの不正な並行呼出しを検出し,避けることができる。
9.7 エンタプライズBean提供者の責任
9.7では,エンタプライズBeanを確実に任意のEJBコンテナに配置可能とする実体エンタプライズBean提供者の責任を示す。
9.7.1 クラス及びインタフェース
エンタプライズBean提供者は,次のクラスファイルを提供する責任をもつ。
-
エンタプライズBeanクラス。
-
エンタプライズBeanの遠隔インタフェース。
-
エンタプライズBeanのホームインタフェース。
9.7.2 エンタプライズBeanクラス
エンタプライズBeanクラスに対する要件は,次のとおりとする。
-
クラスは,インタフェースjavax.ejb.EntityBeanを実装しなければならない。
-
クラスは,publicとして定義しなければならず,abstractとして定義してはならない。
-
クラスは,エンタプライズBeanの遠隔インタフェースを実装してもよい。ただし,これは必要ではない。
参考:エンタプライズBeanクラスは,thisを,メソッド引数又は結果として不用意に渡さないために,
遠隔インタフェースを実装しないことが望ましい。
-
クラスは,業務メソッド,並びにメソッドejbCreate(),メソッドejbPostCreate()及びメソッド
ejbFind<METHOD>()を,9.7の以下に示すとおりに実装しなければならない。
9.7.3 メソッドejbCreate
エンタプライズBeanクラスは,ゼロ以上のメソッドejbCreate()を定義してもよい。ただし,シグネチャは,
次の規則に従わなければならない。
-
メソッド名は,ejbCreateでなければならない。
-
メソッドは,publicとして宣言しなければならない。
-
返却値の型は,1次キー型でなければならない。
-
メソッド引数及び返却値の型は,JavaRMIに対して文法に合った型でなければならない。
-
throws節は,任意のアプリケーション固有の例外を定義してもよい。
-
throws節は,java.rmi.RemoteExceptionを含んでもよい。
-
throws節は,javax.ejb.CreateExceptionを含んでもよい。
-
メソッドejbCreate()の返却値の型は,1次キー型又は集まりのいずれかでなければならない(9.9.1を参照。)。
9.7.4 メソッドejbPostCreate
各メソッドejbCreate()に対して,エンタプライズBeanクラスは,次の規則を使用して,
一致するメソッドejbPostCreate()を定義してもよい。
-
メソッド名は,ejbPostCreateでなければならない。
-
メソッドは,publicとして宣言しなければならない。
-
返却値の型は,voidでなければならない。
-
メソッド実引数は,一致するメソッドejbCreate()の実引数と同じでなければならない。
-
throws節は,任意のアプリケーション固有の例外を定義してもよい。
-
throws節は,java.rmi.RemoteExceptionを含んでもよい。
-
throws節は,javax.ejb.CreateExceptionを含んでもよい。
9.7.5 メソッドejbFind
エンタプライズBeanクラスは,メソッドejbFindByPrimaryKey()を定義しなければならない。
エンタプライズBeanクラスは,付加的なfinderメソッドejbFind<METHOD>()を定義してもよい。
メソッドfinder()のシグネチャは,次の規則に従わなければならない。
-
メソッド名は,(例えば,ejbFindByPrimaryKey(),ejbFindLargeAccounts(),
ejbFindLateShipments()などのように)接頭辞“ejbFind”で始めなければならない。
-
メソッドは,publicとして宣言しなければならない。
-
メソッド実引数及び返却値の型は,JavaRMIに文法に合った型でなければならない。
-
メソッドの返却値の型は,エンタプライズBeanの1次キー型又は1次キー型のオブジェクトの集まりでなければならない
(9.9.1参照。)。
-
throws節は,任意のアプリケーション固有の例外を定義してもよい。
-
throws節は,java.rmi.RemoteExceptionを含んでもよい。
-
throws節は,javax.ejb.FinderExceptionを含んでもよい。
-
各実体エンタプライズBeanは,メソッドejbFindByPrimaryKeyを定義しなければならない。
9.7.6 業務メソッド
クラスは,ゼロ以上の業務メソッドを定義してもよい。ただし,そのシグネチャは,次の規則に従わなければならない。
-
関数名は任意でよいが,(ejbCreate(),ejbActivate()などの)
EJB体系によって定義されるメソッドの名前と衝突してはならない。
-
業務メソッドは,publicとして宣言しなければならない。
-
メソッド実引数及び返却値の型は,JavaRMIに対して文法に合った型でなければならない。
-
throws節は,任意のアプリケーション固有の例外を定義してもよい。
-
throws節は,java.rmi.RemoteExceptionを含んでもよい。
9.7.7 エンタプライズBeanの遠隔インタフェース
エンタプライズBeanの遠隔インタフェースの要件は,次のとおりとする。
-
インタフェースは,インタフェースjavax.ejb.EJBObjectを拡張しなければならない。
-
このインタフェースで定義されるメソッドは,JavaRMIのための規則に従わなければならない。
すなわち,その実引数及び返却値は,JavaRMIに対して妥当な型をもたなければならないし,throws節は,
java.rmi.RemoteExceptionを含まなければならない。
-
遠隔インタフェースで定義される各メソッドに対して, エンタプライズBeanのクラスに一致するメソッドが存在しなければならない。
一致するメソッドは,次をもたなければならない。
-
同じ名前。
-
同じ数及び同じ型の実引数,並びに同じ返却値の型。
-
エンタプライズBeanクラスの一致するメソッドのthrows節で定義される例外はすべて,
遠隔インタフェースのメソッドのthrows節で定義されなければならない。
9.7.8 エンタプライズBeanのホームインタフェース
エンタプライズBeanのホームインタフェースのシグネチャの要件は,次のとおりとする。
-
インタフェースは,インタフェースjavax.ejb.EJBHomeを拡張しなければならない。
-
このインタフェースで定義されるメソッドは,JavaRMIのための規則に従わなければならない。
すなわち,その実引数及び返却値は,JavaRMIに対して妥当な型をもたなければならないし,throws節は,
java.rmi.RemoteExceptionを含まなければならない。
-
ホームインタフェースで定義される各メソッドは,次のいずれかでなければならない。
-
メソッドcreate()。
-
メソッドfinder()。
-
メソッドcreate()の機能をもつ各メソッドは,“create”と命名され,
エンタプライズBeanクラスで定義されるメソッドejbCreate()の一つと一致しなければならない。
一致するメソッドejbCreate()は,同じ数及び同じ型の実引数をもたなければならない。
ただし,返却値の型は,異なることに注意。
-
メソッドcreate()の返却値の型は,エンタプライズBeanの遠隔インタフェース型でなければならない。
-
エンタプライズBeanクラスの一致するメソッドejbCreate()及びメソッドejbPostCreate()の
throws節で定義される例外はすべて,遠隔インタフェースの一致するメソッドcreate()の
throws節に含まなければならない。つまり,メソッドcreate()に対して定義される例外の集合は,
メソッドejbCreate()及びメソッドejbPostCreate()に対して定義される例外の合併集合の上位集合,
つまり,合併集合を含む集合,でなければならない。
-
メソッドcreate()のthrows節は,javax.ejb.CreateExceptionを含まなければならない。
-
メソッドfinder()の機能をもつ各メソッドは,“find<METHOD>”(つまり,findLargeAccounts
など)と命名され,エンタプライズBeanクラスで定義されるメソッドejbFind<METHOD>()の一つ
(つまり,ejbFindLargeAccounts()など)と一致しなければならない。一致するメソッドejbFind<METHOD>()
は,同じ数及び同じ型の実引数をもたなければならない。返却値の型は,異なるかもしれないことに注意。
-
メソッドfinder()の返却値の型は,エンタプライズBean の遠隔インタフェースの型又はその集まりでなければならない。
-
エンタプライズBeanクラスのメソッドejbFind()のthrows節で定義される例外はすべて,
遠隔インタフェースの一致するメソッドcreate()のthrows節に含まなければならない。
-
メソッドfinder()のthrows節は,javax.ejb.FindExceptionを含まなければならない。
9.7.9 エンタプライズBeanの1次キークラス
Bean提供者は,1次キークラスを定義しなければならない。クラスは,Javaプログラム言語の直列化プロトコルによって
直列化可能でなければならない。
9.8 コンテナ提供者の責任
9.8では,実体Beanをサポートするコンテナ提供者の責任を記述する。
9.8.1 実装クラスの生成
コンテナが提供するツールは,エンタプライズBean配置時に付加クラスを生成する責任をもつ。ツールはクラス及びインタフェースを自己検査して,付加クラスの生成に必要な情報を獲得する。クラス及びインタフェースは,エンタプライズBean提供者によって及びBean配置記述子から得られる情報をもとに提供される。
コンテナツールは次のクラスを生成しなければならない。
-
エンタプライズBeanのホームインタフェースを実装するクラス
-
エンタプライズBeanの遠隔インタフェースを実装するクラス
コンテナツールは同様に,あるコンテナ固有のコードとエンタプライズBeanクラスとを混合したクラスを生成してもよい。例えば,コードは実行時にコンテナにBeanインスタンスを管理させる。ツールはサブクラス化,委託及びコード生成を使用できる。
コンテナのツールは同様に,業務メソッドをラップする付加コード,及び現存の操作環境に対応した業務論理をカスタム化するため使用される付加コードの生成を可能としてもよい。例えば,AccountBean上のdebit機能に対応するラッパーは,借りた合計が一定の限度を越えないために検査する。
9.8.2 EJBホームクラス
EJBホームクラスは,エンタプライズBeanのホームインタフェースを実装するコンテナ生成クラスとする。クラスはインタフェースjavax.ejb.EJBHomeのメソッド及び型固有のメソッドcreate並びにエンタプライズBeanに固有のメソッドfinderを実装する。
各メソッドcreate()の実装は,一致するメソッドejbPostCreate()に続き,一致するメソッドejbCreate()を呼び出し,これらのメソッドに仮引数create()を渡す。
インタフェースjavax.ejbEJBHomeで定義されるメソッドremove()の実装は,インスタンスがまだ動作可能状態にない場合にインスタンスを活性化し,インスタンス上でメソッドejbRemoveを呼び出す。
各メソッドfind<METHOD>()の実装は,一致するメソッドejbFind<METHOD>()を呼び出す。メソッドfind<METHOD>()の実装は,ejbFind<METHOD>から返された一次キーに対応するEJBオブジェクトを生成し,クライアントにEJBオブジェクト参照を返さなければならない。メソッドejbFind<METHOD>()の一次キーの集まりを返す場合,メソッドfind<METHOD>()の実装は一次キーに対応するEJBオブジェクトの集まりを生成し,クライアントに集まりを返さなければならない。
9.8.3 EJBオブジェクトクラス
EJBオブジェクトクラスは,エンタプライズBeanの遠隔インタフェースを実装するコンテナ生成クラスとする。EJBオブジェクトクラスは,インタフェースjavax.ejb.EJBObjectのメソッド及びエンタプライズBean固有の業務メソッドを実装する。
(インタフェースjavax.ejb.EJBObjectで定義される)メソッドremove()の実装は,(インスタンスがまだ動作可能状態にない場合に)インスタンスを活性化し,インスタンス上でメソッドejbRemoveを呼び出さなければならない。
各業務メソッドの実装は,インスタンスがまだ動作可能状態にない場合にインスタンスを活性化し,インスタンス上で一致する業務メソッドを呼び出さなければならない。
9.8.4 ハンドルクラス
コンテナはエンタプライズBeanに対応するハンドルクラスを実装する責任をもつ。ハンドルクラスはJavaプログラム言語直列化プロトコルによって直列化できなければならない。
9.8.5 メタデータクラス
コンテナは,メタデータをクライアントのビュー契約に提供するクラスを実装する責任をもつ。クラスは有効なクラスRMI/Valueでなければならず,インタフェースjavax.ejbEJBMetaDataを実装しなければならない。
9.8.6 インスタンスの再入
コンテナは,9.6で定義された規則を実行しなければならない。
9.8.7 トランザクション適用範囲,セキュリティ及び例外
コンテナは,11.,14.及び12.に記述するトランザクション適用範囲,セキュリティ検査及び例外処理に関する規則に従わなければならない。
9.9 その他
9.9.1 集まり
実体ファインダメソッドの返却値の型は,単一のEJBオブジェクト参照かEJBオブジェクト参照の集まりかのいずれであってもよい。ファインダメソッドがEJBオブジェクトを一つ以上見つける可能性がある場合は,Bean開発者はメソッドejbFind<METHOD>()及びメソッドfind<METHOD>()の返却値の型を集まりとして定義しなければならない。
集まりに対応するJDK1.1x型は,インタフェースjavax.util.Enumerationであり,そのためEJBオブジェクトの集まりを返すファインダメソッドは返却値の型を定義して,javax.util.Enumerationとしなければならない。
JDK1.2の集まりに対するサポートはJDK1.1よりも優れている。EJBについては,将来的に,ファインダに使用できる型を拡張し,java.util.Enumeration型に加えJDK1.2の集まりを使用できるようなバージョンをリリースしたい。
ホームインタフェースで定義されたファインダメソッドの例を次に示す。
public AccountHome {
...
java.util.Enumeration findLargeAccounts(double limit)
throws FinderException, RemoteException;
...
}
エンタプライズBeanのクラスで実装されたファインダメソッドの例を次に示す。
public AccountBean {
...
public java.util.Enumeration ejbFindLargeAccounts(double limit)
throws FinderException, RemoteException
{
...
}
...
}
9.10 コンテナ管理実体Beans
9.3から9.9にBean管理永続性を有する実体Beansの部品契約を記述している。9.10では,コンテナ管理永続性を有する実体Beansの契約を指定する。
この9.10では,Bean管理永続性を有する実体の契約における相違点を定義する。
9.10.1 配置記述子特性containerManagedFields
コンテナは,配置記述子の特性containerManagedFieldsを検査して,実体Beanがコンテナ管理永続型であることを決定する。特性containerManagedFieldsが配置記述子で定義される場合,実体Beanはコンテナ管理永続型とする。
特性containerManagedFieldsの値は,インスタンスフィールドのリストとし,エンタプライズBean開発者は,データベースからのロード及び記憶によって,コンテナのインスタンスフィールド管理を要求する。エンタプライズBeanコードは,データベースアクセス呼出しを包含してはならない。データベースアクセス呼出しは,配置時にコンテナツールが生成する。
もっぱらコンテナ管理永続性に対するサポートを提供することに特化したコンテナは,典型的には,豊富な配置時ツールを提供して,エンタプライズBean配置者によるインスタンスフィールドの基礎的なデータソースへのマップ化を確立できることを可能にする。このコンテナは特定のレガシーデータソース用に特殊化されることが多い。コンテナ提供者のツールによってマップ化プロセスは簡易化されても,Bean配置者はマップ化プロセスに関与することが望ましい(例えば,マップ化プロセスは完全自動ではない)。
コンテナは,後述するとおり,ejbCreate,ejbRemove,ejbLoad及びejbStoreの実行前又は実行後に,Beanのインスタンス変数と使用中のデータソースとの間でデータを移動する。コンテナは同様にファインダメソッドの実装に責任をもつ。
エンタプライズbean提供者は,コンテナ管理フィールドをpublicとして宣言し,コンテナツールが,インスタンスフィールドとデータソースとの間でデータを移動する付加クラスを生成可能としなければならない。コンテナ管理フィールドは,Java直列化可能型でなければならない。
これは,コンテナがJava直列化を使用してフィールドを抽出しなければならないという意味ではない。例えば,フィールドがプリミティブ型又はフィールドがすべてpublicとして宣言されるクラスのインスタンスへの参照である場合,コンテナは直接フィールドを抽出してもよい。
9.10.2 ejbCreate,ejbPostCreate
Bean管理永続性の場合,エンタプライズBean開発者はメソッドejbCreate()のデータベースにレコードを挿入するコードを書き込む責任をもつ一方,コンテナ管理永続性の場合は,メソッドejbCreate()の完了後にデータベース挿入を実行するのはコンテナとする。
エンタプライズBean開発者の責任は,入力仮引数からメソッドejbCreate()のコンテナ管理フィールドを初期化することとする。そして,ejbCreate()が返す場合,コンテナはインスタンスからコンテナ管理フィールドを抽出し,それをデータベースに挿入することができる。
メソッドejbCreate()の返却値は,コンテナ管理永続性を有するエンタプライズBeansには無効でなければならない。
コンテナは,データベースで新たに生成された実体表現の一次キーフィールドを抽出する責任及び一次キー用にEJBオブジェクト参照を生成する責任をもつ。
その後,コンテナはインスタンスで一致するメソッドejbPostCreate()を呼び出す。インスタンスは,セション文脈オブジェクト上でgetPrimaryKey()を呼び出して一次キーを発見することができる。
コンテナは,適正なトランザクション文脈で,ejbCreate,データベース挿入操作及びejbPostCreateを実行しなければならない。
9.10.3 ejbRemove
コンテナは,EJBオブジェクト参照上又はEJBホームインタフェース上のクライアント呼出しのremove()操作に答えて,コンテナ管理永続性を有する実体Beanインスタンス上でメソッドejbRemove()を呼び出す。
エンタプライズBean提供者は,メソッドejbRemoveを使用して,実体表現がデータベースから除去される前に実行されるべき動作をすべて実装することができる。
ejbRemoveが返した後で,コンテナはデータベースから実体表現を除去する。
コンテナは,適正なトランザクション文脈でejbRemove及びデータベース消去操作を実行しなければならない。
9.10.4 ejbLoad
コンテナがデータベースで実体状態を有するインスタンスの状態を同期化する必要がある場合,コンテナは,コンテナ管理フィールドのデータベースから実体状態を読み取り,その後インスタンス上でメソッドejbLoad()を呼び出す。
エンタプライズBean開発者は,コンテナがメソッドejbLoad()を呼び出す直前にデータベースからコンテナ管理フィールドをロードしていると考えてよい。例えば,エンタプライズBeanは,メソッドejbLoad()を使用して,コンテナが読み取ったフィールドの値で計算を実行できる(テキストフィールドの圧縮復元の実行など)。
9.10.5 ejbStore
コンテナがデータベースの実体状態の状態をインスタンスの状態で同期化する必要がある場合,コンテナは,まずインスタンス上でメソッドejbStore()を呼び出し,その後コンテナ管理フィールドを抽出し,データベースにそれを書き込む。
エンタプライズBean開発者は,メソッドejbStore()を使用して,コンテナがデータベースに書き込む直前にコンテナ管理フィールドの値を設定しなければならない。例えば,メソッドejbStore()は,テキストがデータベースに記憶される前にテキストの圧縮を実行するかもしれない。
9.10.6 ファインダメソッド
エンタプライズBean提供者は,ファインダ(ejbFind<METHOD>())メソッドを書き込まない。
ファインダメソッドは,コンテナ提供者のツールを使用してBean配置時に生成される。例えば,ツールは,メソッドejbFind<METHOD>()を実装するエンタプライズBeanクラスのサブクラスを生成し,又はエンタプライズBeanのホームインタフェースを実装するクラスで,ファインダメソッドの実装を直接生成することができる。
ejbFind<METHOD>名及び仮引数シグネチャは,ejbFindByPrimaryKey以外のメソッドについて,ファインダメソッドの実装を自動的に生成するのに十分な情報をコンテナツールに提供しない点に注意すること。そのため,ビーン提供者は,各ファインダメソッドの記述を提供する責任をもつ。ビーン配置者は,コンテナツールを使用して,ビーン提供者が提供する記述に基づいてファインダメソッドの実装を生成する。エンタプライズJavaBeans体系は,ファインダメソッド記述の書式を指定しない。
9.10.7 一次キー型
コンテナは一次キー型を操作できなければならない。そのため,コンテナ管理永続性を有するBeanに対応する一次キー型は,次の規則に従わなければならない。
一次キー型は,publicでなければならない。
一次キークラスのすべてのフィールドは,publicとして宣言されなければならない。
クラスは,publicデフォルトコンストラクタを持たなければならない。
一次キークラスのフィールドの名前は,コンテナ管理フィールドの名前のサブセットでなければならない(このため,コンテナは,インスタンスのコンテナ管理フィールドから一次キーフィールドを抽出でき,その逆も可能とする。)。
9.11 シーケンス図
9.11では,シーケンス図を使用して実体Beanインスタンスとそのコンテナ間のインタラクションを示す。
9.11.1 注意事項
シーケンス図には,“コンテナ提供クラス”と呼ばれる箱が示されている。これらは,コンテナの一部であるクラス,又はコンテナツールが生成したクラスのいずれかとする。これらのクラスは,コンテナ実装固有のプロトコルを通じて相互に通信する。そのため,これらのクラス間の通信は図に表示されない。
図で表示されるクラスは規定的実装ではなく,説明的実装として考えなければならない。
9.11.2 実体オブジェクトの生成
Bean管理永続性を有するエンタプライズBeanの生成を図9.6に示す。
 |
図9.6 Bean管理永続性を有するエンタプライズBeanの生成
コンテナ管理永続性を有するエンタプライズBeanの生成を図9.7に示す。
 |
図9.7 コンテナ管理永続性を有するエンタプライズBeanの生成
9.11.3 トランザクションでのインスタンス非活性化及びインスタンス活性化
Bean管理永続性を有するエンタプライズBeanインスタンスの非活性化及び再活性化を図9.8に示す。
 |
図9.8 Bean管理永続性を有するエンタプライズBeanインスタンスの非活性化及び再活性化
コンテナ管理永続性を有するエンタプライズBeanインスタンスの非活性化及び再活性化を図9.9に示す。
 |
図9.9 コンテナ管理永続性を有するエンタプライズBeanインスタンスの非活性化及び再活性化
9.11.4 トランザクションのコミット
9.11.4では,トランザクションコミット中のシーケンスを記述する。
実体Beanプロトコルは,コンテナがトランザクションコミット時にインスタンスの後処理を選択する柔軟性を有するものとして設計される。9.11.4のシーケンス図は,インスタンス状態に関してコミットオプションの選択肢を示す。コミットオプションの選択は実体Beanにはみえない。実体Beanは,コンテナが選択したオプションに関係なく,正しく作動する。
三つのオプションは次のとおりとする。
オプションA:コンテナはトランザクション間で“動作可能”インスタンスをキャッシュする。インスタンスは,永続的記憶域のオブジェクトの状態に排他的にアクセスする。そのためコンテナは,次のトランザクション開始時に永続的記憶域からインスタンスの状態を同期化する必要はない。i
オプションB:コンテナはトランザクション間で“動作可能”インスタンスをキャッシュする。オプションAとは異なり,インスタンスは永続的記憶域のオブジェクトの状態に排他的にアクセスしない。そのためコンテナは,次のトランザクション開始時に永続的記憶域からインスタンスの状態を同期化しなければならない。
オプションC:コンテナはトランザクション間で“動作可能”インスタンスをキャッシュしない。インスタンスは,トランザクションの完了後に使用可能インスタンスのプールに返される。
コンテナは,三つのオプションすべてに対するトランザクションコミットにおいて,インスタンスの状態を永続的記憶域で同期化しなければならない点に注意すること。
|
データベースへのインスタンス状態の書込み |
インスタンスの動作可能状態 |
インスタンスの有効状態保持 |
オプションA |
Yes |
Yes |
Yes |
オプションB |
Yes |
Yes |
No |
オプションC |
Yes |
No |
No |
表9.1 コミット時オプションの要約
Bean管理永続性を有するエンタプライズBeanインスタンスを包含するトランザクションコミットプロトコルを図9.10に示す。
 |
図9.10 Bean管理永続性を有するエンタプライズBeanインスタンスを包含するトランザクションコミットプロトコル
コンテナ管理永続性を有するエンタプライズBeanインスタンスに対応するトランザクションコミットプロトコルを図9.11に示す。
 |
図9.11 コンテナ管理永続性を有するエンタプライズBeanインスタンスに対応するトランザクションコミットプロトコル
9.11.5 次トランザクション起動
新しいトランザクション起動時に,Bean管理永続性を有するBeanに対し実行されるプロトコルを図9.12に示す。図中の三つのオプションは,前述の三つのコミットオプションを示している。
 |
図9.12 新しいトランザクション起動時に,Bean管理永続性を有するBeanに対し実行されるプロトコル
新しいトランザクション開始時に,コンテナ管理永続性を有するBeanに対し実行されるプロトコルを図9.13に示す。
 |
図9.13 新しいトランザクション開始時に,コンテナ管理永続性を有するBeanに対し実行されるプロトコル
9.11.6 実体オブジェクトの除去
Bean管理永続性を有する実体エンタプライズBeanの消滅を図9.14に示す。
 |
図9.14 Bean管理永続性を有する実体エンタプライズBeanの消滅
コンテナ管理永続性を有する実体エンタプライズBeanの消滅を図9.15に示す。
 |
図9.15 コンテナ管理永続性を有する実体エンタプライズBeanの消滅
9.11.7 オブジェクトの発見
Bean管理永続性を有する実体エンタプライズBean上でのファインダメソッドの実行を図9.16に示す。
 |
図9.16 Bean管理永続性を有する実体エンタプライズBean上でのファインダメソッドの実行
コンテナ管理永続性を有する実体エンタプライズBean上でのファインダメソッドの実行を図9.17に示す。
 |
図9.17 コンテナ管理永続性を有する実体エンタプライズBean上でのファインダメソッドの実行
9.11.8 プールへのインスタンス付加及びプールからのインスタンス除去
9.11.2から9.11.7の図は,“存在しない”状態と“プールされた”状態との間のシーケンスを図示していない。(9.3の図参照)
インスタンスをプールに付加するコンテナに対応するシーケンスを図9.18に示す。
 |
図9.18 インスタンスをプールに付加するコンテナに対応するシーケンス
インスタンスをプールから除去するコンテナに対応するシーケンスを図9.19に示す。
 |
図9.19 インスタンスをプールから除去するコンテナに対応するシーケンス
目次 | 前
| 次