33.2. EJB 非活性化と ManagedEntityInterceptor
ManagedEntityInterceptor (MEI) は Seam ではオプションのインターセプタです。 有効にすると対話スコープのコンポーネントに適用されます。 MEI を有効にするには org.jboss.seam.init.core コンポーネントで distributable を true に設定します。 また、 次のコンポーネント宣言を components.xml ファイルに追加または更新することができます。
<core:init distributable="true"/>
<core:init distributable="true"/>
これは HTTP Session の複製を有効にしませんが、Seam による EJB コンポーネントまたは HTTP Session 内のコンポーネントいずれかの非活性化の処理を可能にします。
MEI によって、拡張永続コンテキストを 1 つ以上持つ対話の全寿命に渡り、 永続コンテキストによってロードされたエンティティインスタンスは全て管理されているようにします。つまり、 これらのエンティティインスタンスは非活性化イベントによって時期尚早に切り離されることはありません。 これにより拡張永続コンテキストの整合性を維持するため、その整合性が保証されます。
整合性が脅かされる状況として、 拡張永続コンテキストをホストするステートフルセッション Bean の不活性化と HTTP Session の非活性化があります。
33.2.1. 非活性化と永続性の衝突 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
永続コンテキスト は永続マネージャがデータベースからロードしたエンティティインスタンス (オブジェクト) の保存に使用されます。 永続コンテキスト内には一意のデータベースの記録に対し 1 つのオブジェクトしか存在しません。 記録が永続コンテキストにロードされる場合、 アプリケーションはそのデータベースに対する呼び出しを回避することができるため、よく 1 次レベルキャッシュ と呼ばれます。
永続コンテキスト内のオブジェクトは変更可能であり、 変更後は ダーティ とみなされます。 変更は永続マネージャによって追跡され、 必要に応じてデータベースに移行されます。 このため永続コンテキストはデータベースに対して保留となっている変更を管理します。
データベース指向のアプリケーションは直ちにデータベースに転送しなければならないトランザクション情報をキャプチャします。 この情報は必ずしも 1 画面でキャプチャできるとは限らず、 ユーザーは保留にしている変更に応じるか拒否するかの選択をしなければならない場合があります。
こうしたトランザクション側のことはユーザーにとっては必ずしもわかりやすい必要はありませんでした。拡張永続コンテキストによりトランザクションに関するユーザーの理解は広がります。アプリケーションが必要とする限り変更を保持してから、組み込み永続マネージャ機能で保留している変更をデータベースにプッシュすることができます (
EntityManager#flush())。
永続マネージャは オブジェクト参照 でエンティティインスタンスにリンクされます。 エンティティインスタンスはシリアライズ可能ですが永続マネージャはシリアライズできません。 シリアライズはステートフルセッション Bean または HTTP Session のいずれかが非活性化される場合に可能となります。 アプリケーションの動作を継続させるためには、 永続マネージャとそのエンティティインスタンス間の関係を管理する必要があります。 MEI によってこれに対応します。