TopLinkとHibernateの違い

過去の日記で紹介したJonathan Lehr's Weblogの方のIs Hibernate Really the Best Choice?ですが、Randy Staffordによる2月21日のコメントがとても興味深いです。

このブログで問題にしているのはTopLinkではセッションが閉じたあとでもオブジェクトを共有できるのに対し、Hibernateは(悪名高き)LazyInitializationExceptionが出てしまうというもの。これに対しGavinはトランザクション分離(isolation)とスケーラビリティを考えるとHibernateのデザインは正しいと言っています。以下がRandy Staffordのコメントです(ここでは一部しか引用しませんが、ぜひGavinのコメントと合わせて、Randyのコメント全文を読んでみてください)。

Gavin I agree that transaction isolation (at the object level) is perhaps the most significant problem that object persistence technologies have to solve.
...
I call those approaches implicit copy on write, which is what GemStone does, implicit copy on read, which is what Hibernate does, and explicit copy before write, which is what TopLink does.

ここでは、Hibernateが"implicit copy on read"であるのに対し、TopLinkは"explit before write"であると言っています。つまり、セッションはトランザクションと一緒であり、分離オブジェクトが変更されるかもしれないからセッションクローズ後には共有できない(Hibernate)という考えに対し、むしろプログラムデザイン上で変更時に明示的にオブジェクトをコピーすれば別のトランザクションで同じオブジェクトを更新することはない(TopLink)、という違いです。

Hibernateでは、確かにセッションごとに同じオブジェクトを何回も生成するのはコストがかかると思いますが、これはimplicitに(つまり自動で)isolationの問題を解決するためにそうしているので、それが嫌ならSeamでセッション管理をしておけばよいわけです。でも、TopLinkのユーザから見れば、そんなことをしなくても、分離オブジェクトをキャッシュして、それを別のセッションにマージできた方が簡単ではないかということになります。

面白いです。こういうORM実装のデザインの違いって、どこかの論文とかで整理されていないですかね。