我们使用带有 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 请求中只有一个会话),当我们加载表单支持对象时(比如一些实体的列表使用HQL 查询),在执行查询之前休眠检查会话中是否有脏对象,它看到 foo 是并刷新它,当事务 2 提交时,更新被写入数据库。问题是即使它是一个只读事务并且即使 foo 在事务 2 中没有更新,hibernate 也不知道哪个对象在哪个事务中更新,并且不只刷新该事务中的对象。有什么建议么?以前有人遇到过类似的问题吗
更新:这篇文章进一步阐明了这个问题:http ://brian.pontarelli.com/2007/04/03/hibernate-pitfalls-part-2/