10.3.3. Seam 管理永続コンテキストとアトミックな対話
merge() を使用したり、 各要求の開始時にデータを再ロードしたり、 例外と格闘しなくとも (LazyInitializationException や NonUniqueObjectException)、 対話にスコープされる永続コンテキストにより複数のサーバー要求にまたがる楽観的なトランザクションをプログラムすることができます。
楽観的ロックを使ってトランザクションの分離と一貫性を実現します。 Hibernate および EJB3 はいずれも
@Version アノテーションを付与することで楽観的ロックの使用を容易にします。
デフォルトでは、 永続コンテキストは各トランザクションの終わりでデータベースと同期 (フラッシュ) されます。 これが目的の動作である場合もありますが、 すべての変更はメモリに保持され対話が正常に終了したときにのみデータベースに書き込まれる動作を期待することの方が多いでしょう。 これにより EJB3 永続との真にアトミックな対話を可能にします。 ただし、 Hibernate では仕様により定義される
FlushModeType に対するベンダー拡張としてこの機能を提供しています。他のベンダーもすぐに同様の拡張機能を提供することが予想されます。
Seam では対話の開始時に
FlushModeType.MANUAL を指定することができます。 現在は Hibernate が永続を実現する構成要素である場合にのみ機能しますが、 他のベンダーによる同等の拡張機能もサポートする予定です。
これで
claim オブジェクトは全対話の間、 永続コンテキストによって管理され続けます。 この claim に変更を加えることができます。
public void addPartyToClaim() {
Party party = ....;
claim.addParty(party);
}
public void addPartyToClaim() {
Party party = ....;
claim.addParty(party);
}
ただし、 これらの変更は明示的に同期が発生するよう強制するまではデータベースに対してフラッシュされません。
@End public void commitClaim() {
em.flush();
}
@End public void commitClaim() {
em.flush();
}
pages.xml から
flushMode を MANUAL に設定することもできます。 たとえばナビゲーションルールでは以下のようになります。
<begin-conversation flush-mode="MANUAL" />
<begin-conversation flush-mode="MANUAL" />
いずれの Seam 管理永続コンテキストに対しても手動によるフラッシュモードを使用するよう設定できます。