OpenSessionInView フィルターで Hibernate Spring MVC を使用しています。これが私たちが遭遇している問題です(疑似コード)
transaction 1
load object foo
transaction 1 end
update foo's properties (not calling session.save or session.update but only foo's setters)
validate foo (using hibernate validator)
if validation fails ?
go back to edit screen
transaction 2 (read only)
load form backing objects from db
transaction 2 end
go to view
else
transaction 3
session.update(foo)
transaction 3 end
私たちが抱えている問題は、検証が失敗した場合、foo が休止状態セッションで「ダーティ」とマークされていることです (OpenSessionInView を使用しているため、http 要求全体で 1 つのセッションしかありません)。 HQLクエリ)、セッションにダーティオブジェクトがあるかどうかをクエリチェックを実行する前に休止状態にし、fooが存在することを確認してそれをフラッシュし、トランザクション2がコミットされると、更新がデータベースに書き込まれます。問題は、それが読み取り専用のトランザクションであり、トランザクション 2 で foo が更新されなかったとしても、hibernate はどのトランザクションでどのオブジェクトが更新されたかを認識せず、そのトランザクションからオブジェクトのみをフラッシュしないことです。助言がありますか?誰かが以前に同様の問題に遭遇しましたか
更新: この投稿は、問題をさらに明らかにします: http://brian.pontarelli.com/2007/04/03/hibernate-pitfalls-part-2/