5.7. Mutable インターフェースと @ReadOnly
多くのアプリケーションサーバーは
HttpSession のクラスタリングを備えており、setAttribute 明示的に呼び出された場合にのみ、セッションにバインドした可変のオブジェクトの状態への変化が複製されます。これはフェールオーバーが発生する場合にのみ出現するバグを招く可能性があり、 開発時に効果的なテストを行うことができません。 さらに、 複製メッセージ自体はセッション属性にバインドしたシリアライズされたオブジェクトグラフ全体を含むため効率的ではありません。
EJB ステートフルセッション Bean は自動ダーティチェックを行い (つまり、 自動的にオブジェクト状態の変更を検出して更新された状態をデータベースと同期させる必要があります)、 可変状態を複製する必要があります。 洗練された EJB コンテナは属性レベルの複製などの最適化の導入が可能です。 残念ながらすべての Seam ユーザーが EJB3 に対応する環境で作業をしているわけではないので、 Seam はセッションスコープや対話スコープの JavaBean およびエンティティ Bean のコンポーネント用にクラスタセーフな状態管理の追加的なレイヤを提供します。
セッションスコープや対話スコープの JavaBean コンポーネントの場合、 このコンポーネントがアプリケーションにより呼び出されると Seam は各要求ごとに 1 度
setAttribute() を呼び出して自動的に複製を強制します。 ただし、 この方法は read-mostly コンポーネントには役立ちません。 org.jboss.seam.core.Mutable インターフェースを実装、または org.jboss.seam.core.AbstractMutable を拡張して、 コンポーネントの中に独自のダーティチェックのロジックを記述しこの動作を制御します。 以下に例を示します。
または、 同様の結果を得るために
@ReadOnly アノテーションを使用することもできます。
セッションスコープや対話スコープのエンティティ Bean コンポーネントの場合、 (対話スコープの) エンティティが現在 Seam 管理永続コンテキストに関連付けられているため複製が不要にならない限り、 Seam は各要求ごとに 1度
setAttribute() を呼び出して自動的に複製を強制します。 この方法は必ずしも効率的とは限らないので、 セッションや対話スコープのエンティティ Bean は注意して使用してください。 エンティティ Bean インスタンスの「管理」にはステートフルセッション Bean や JavaBean コンポーネントをいつでも記述することができます。 以下に例を示します。
Seam Application Framework の
EntityHome クラスは Seam コンポーネントを使ったエンティティ Bean インスタンスの管理に適した例となる点に留意してください。