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 を拡張して、 コンポーネントの中に独自のダーティチェックのロジックを記述しこの動作を制御します。 以下に例を示します。
@Name("account") 
public class Account extends AbstractMutable { 
  private BigDecimal balance; 
  public void setBalance(BigDecimal balance) { 
    setDirty(this.balance, balance); 
    this.balance = balance; 
  } 
  
  public BigDecimal getBalance() { 
    return balance; 
  } 
  ... 
}
Copy to Clipboard Toggle word wrap
または、 同様の結果を得るために @ReadOnly アノテーションを使用することもできます。
@Name("account") 
public class Account { 
  private BigDecimal balance; 
  public void setBalance(BigDecimal balance) { 
    this.balance = balance; 
  } 
  
  @ReadOnly 
  public BigDecimal getBalance() { 
    return balance; 
  } 
  ... 
}
Copy to Clipboard Toggle word wrap
セッションスコープや対話スコープのエンティティ Bean コンポーネントの場合、 (対話スコープの) エンティティが現在 Seam 管理永続コンテキストに関連付けられているため複製が不要にならない限り、 Seam は各要求ごとに 1度 setAttribute() を呼び出して自動的に複製を強制します。 この方法は必ずしも効率的とは限らないので、 セッションや対話スコープのエンティティ Bean は注意して使用してください。 エンティティ Bean インスタンスの「管理」にはステートフルセッション Bean や JavaBean コンポーネントをいつでも記述することができます。 以下に例を示します。
@Stateful @Name("account") 
public class AccountManager extends AbstractMutable { 
  private Account account; // an entity bean 
  @Unwrap 
  public Account getAccount() { 
    return account; 
  } 
  ... 
}
Copy to Clipboard Toggle word wrap
Seam Application Framework の EntityHome クラスは Seam コンポーネントを使ったエンティティ Bean インスタンスの管理に適した例となる点に留意してください。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat