atomic conversation

SeamはステートフルなWebフレームワークです。その背後にはJPAHibernateといったO/Rマッパーが控えています。従来のステートレスWebフレームワークとO/Rマッパーの組合せは、Viewの表示のときにはすべての表示データがDBから取得されていなければならないという問題がありました(いわゆるLazyInitializationExceptionの問題です)。EJB3では、この問題はExtended Persistence Contenxtで解決されました(過去の日記参照)

Seamでは、Extended Persistence Contextをconversation scopeで管理するというManaged Persistence Contextというものを提供しています。これを使えば、conversationが終了されるときPersistence Contextも自動的に破棄されるので、プログラマはPersistence Contextのライフサイクルのためのコードを書く必要がありません。まさに、WebフレームワークとEJBの「つなぎ(Seam)」ですね。

これに加えて、Seam 1.1からは、conversationの終了と同時にDBコミットが行われるatomic conversationという機能が導入されています(@Endでコミットということ)。Persistence ContextがDBと同期するのはトランザクションの終了時ですが、atomic conversationではリクエスト毎にトランザクションが実行されることがないので、サーバアクセスが頻繁に発生し、その会話の間にメモリに値をキャッシュするようなAjaxアプリケーションで重宝されます。以下はGavinのインタビューから引用。

An atomic conversation is basically a conversation where you can make changes to your persistent objects over many requests to the server, but those changes only become persistent when the conversation ends (or at some other well-defined point). This is a really common thing to want to do in Ajax-based applications.