目次 | |

9. 実体Bean部品契約

備考:実体エンタプライズBeansに対するコンテナサポートは,EJB1.0ではオプションだが, EJB2.0では必須となるだろう。

実体Bean部品契約は,実体Beanとそのコンテナとの間の契約とする。 この契約は,実体Beanインスタンスのライフサイクル及びクライアント呼出し業務メソッドのメソッド委託のモデルを定義する。 この契約の主な目標は,この規定に準拠したEJBコンテナのすべてに渡って,確実に部品が移植可能となることにある。

9.では,この契約のエンタプライズBean開発者のビュー及び部品のライフサイクルを管理するコンテナの責任を定義する。

9.1 実行時実行モデル

9.1では,実行時モデル,及び実体エンタプライズBeanとそのコンテナとの間の契約の記述で使用されるクラスについて述べる。
 
9.1
図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の永続性をコンテナに委託する(これを,コンテナ管理永続性と呼ぶ。)かのいずれかが可能になる。

使用中のデータソースは,データベースというよりもむしろ既存のアプリケーションとなる場合が多いかもしれない。
 

9.2(a)
(a) 実体ビーンがデータベース内のレコードのオブジェクトビューの場合。
9.2(b)
(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
図9.3 エンタプライズBeanインスタンスのライフサイクル

インスタンスは,次の三つの状態の一つとする。

実体エンタプライズBeanインスタンスのライフサイクルの主要な流れを次に示す。 備考:メソッドsetEntityContext()でコンテナがインスタンスに渡す実体文脈は,インタフェースであって, 静的情報を含むクラスではない。例えば,メソッドgetPrimaryKey()の結果は, インスタンスがプールされた状態から動作可能状態へと移動する度に違ってもよい。

9.4 実体Bean部品契約

9.4では,実体Beanとそのコンテナとの間の契約を規定する。契約は,ここではBean管理永続性を仮定して規定する。 コンテナ管理永続性に対する契約との相違は,9.10で定義する。

9.4.1 エンタプライズBeanインスタンスのビュー

契約における,エンタプライズBeanインスタンスの側面を示す。

エンタプライズBeanは,エンタプライズBeanメソッドにおいて,次の機能を実装する責任をもつ。

9.4.2 コンテナのビュー

次は,状態管理契約のコンテナ側とする。コンテナは,ここに示すとおりに,次のメソッドを呼び出さなければならない。

9.5 複数トランザクションからの並行アクセス

エンタプライズBean開発者は,業務メソッドを書く場合に,複数のトランザクションからの並行アクセスについて考慮する 必要はない。エンタプライズBean開発者は,コンテナが,複数トランザクションから並行的にアクセスされる実体Bean に対する適切な同期を確実に行うと仮定して,メソッドを書く。

実体コンテナは,通常は,二つの実装方式の内の一つを使用して,適正な同期を達成する。ただし,これらの方式は, 説明であって規定ではない。

9.4
図9.4 データベースシステムレベルでの同期
9.5
図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提供者は,次のクラスファイルを提供する責任をもつ。

9.7.2 エンタプライズBeanクラス

エンタプライズBeanクラスに対する要件は,次のとおりとする。

9.7.3 メソッドejbCreate

エンタプライズBeanクラスは,ゼロ以上のメソッドejbCreate()を定義してもよい。ただし,シグネチャは, 次の規則に従わなければならない。

9.7.4 メソッドejbPostCreate

各メソッドejbCreate()に対して,エンタプライズBeanクラスは,次の規則を使用して, 一致するメソッドejbPostCreate()を定義してもよい。

9.7.5 メソッドejbFind

エンタプライズBeanクラスは,メソッドejbFindByPrimaryKey()を定義しなければならない。

エンタプライズBeanクラスは,付加的なfinderメソッドejbFind<METHOD>()を定義してもよい。

メソッドfinder()のシグネチャは,次の規則に従わなければならない。

9.7.6 業務メソッド

クラスは,ゼロ以上の業務メソッドを定義してもよい。ただし,そのシグネチャは,次の規則に従わなければならない。

9.7.7 エンタプライズBeanの遠隔インタフェース

エンタプライズBeanの遠隔インタフェースの要件は,次のとおりとする。

9.7.8 エンタプライズBeanのホームインタフェース

エンタプライズBeanのホームインタフェースのシグネチャの要件は,次のとおりとする。

9.7.9 エンタプライズBeanの1次キークラス

Bean提供者は,1次キークラスを定義しなければならない。クラスは,Javaプログラム言語の直列化プロトコルによって 直列化可能でなければならない。

9.8 コンテナ提供者の責任

9.8では,実体Beanをサポートするコンテナ提供者の責任を記述する。

9.8.1 実装クラスの生成

コンテナが提供するツールは,エンタプライズ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
    図9.6 Bean管理永続性を有するエンタプライズBeanの生成

    コンテナ管理永続性を有するエンタプライズBeanの生成を図9.7に示す。
     

    9.7
    図9.7 コンテナ管理永続性を有するエンタプライズBeanの生成

    9.11.3 トランザクションでのインスタンス非活性化及びインスタンス活性化

    Bean管理永続性を有するエンタプライズBeanインスタンスの非活性化及び再活性化を図9.8に示す。
     
    9.8
     
    図9.8 Bean管理永続性を有するエンタプライズBeanインスタンスの非活性化及び再活性化

    コンテナ管理永続性を有するエンタプライズBeanインスタンスの非活性化及び再活性化を図9.9に示す。
     

    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
    図9.10 Bean管理永続性を有するエンタプライズBeanインスタンスを包含するトランザクションコミットプロトコル

    コンテナ管理永続性を有するエンタプライズBeanインスタンスに対応するトランザクションコミットプロトコルを図9.11に示す。
     

    9.11
    図9.11 コンテナ管理永続性を有するエンタプライズBeanインスタンスに対応するトランザクションコミットプロトコル

    9.11.5 次トランザクション起動

    新しいトランザクション起動時に,Bean管理永続性を有するBeanに対し実行されるプロトコルを図9.12に示す。図中の三つのオプションは,前述の三つのコミットオプションを示している。
     
    9.12
    図9.12 新しいトランザクション起動時に,Bean管理永続性を有するBeanに対し実行されるプロトコル

     

    新しいトランザクション開始時に,コンテナ管理永続性を有するBeanに対し実行されるプロトコルを図9.13に示す。
     

    9.13
    図9.13 新しいトランザクション開始時に,コンテナ管理永続性を有するBeanに対し実行されるプロトコル

     

    9.11.6 実体オブジェクトの除去

    Bean管理永続性を有する実体エンタプライズBeanの消滅を図9.14に示す。
     
    9.14
    図9.14 Bean管理永続性を有する実体エンタプライズBeanの消滅

    コンテナ管理永続性を有する実体エンタプライズBeanの消滅を図9.15に示す。
     

    9.15
    図9.15 コンテナ管理永続性を有する実体エンタプライズBeanの消滅

    9.11.7 オブジェクトの発見

    Bean管理永続性を有する実体エンタプライズBean上でのファインダメソッドの実行を図9.16に示す。
     
    9.16
    図9.16 Bean管理永続性を有する実体エンタプライズBean上でのファインダメソッドの実行

    コンテナ管理永続性を有する実体エンタプライズBean上でのファインダメソッドの実行を図9.17に示す。
     

    9.17
    図9.17 コンテナ管理永続性を有する実体エンタプライズBean上でのファインダメソッドの実行

    9.11.8 プールへのインスタンス付加及びプールからのインスタンス除去

    9.11.2から9.11.7の図は,“存在しない”状態と“プールされた”状態との間のシーケンスを図示していない。(9.3の図参照)

    インスタンスをプールに付加するコンテナに対応するシーケンスを図9.18に示す。
     

    9.18
    図9.18 インスタンスをプールに付加するコンテナに対応するシーケンス

    インスタンスをプールから除去するコンテナに対応するシーケンスを図9.19に示す。
     

    9.19
    図9.19 インスタンスをプールから除去するコンテナに対応するシーケンス


    目次 | |