我们正在使用 Hibernate Spring MVC 和 OpenSessionInView 过滤器。 这是我们遇到的一个问题(伪代码)
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 在 hibernate session 中被标记为“脏”(因为我们使用 OpenSessionInView,所以我们在整个 http 请求中只有一个 session ),当我们加载表单支持对象(如使用 HQL 查询的一些实体的列表)时,在执行查询检查 session 中是否有脏对象,它发现 foo 是并刷新它,当事务 2 提交时,更新将写入数据库。 问题是,即使它是一个只读事务,并且即使 foo 没有在事务 2 中更新,hibernate 也不知道哪个对象在哪个事务中被更新,并且不会只刷新该事务中的对象。 有什么建议么?有人遇到过类似的问题吗
更新:这篇文章进一步阐明了这个问题:http://brian.pontarelli.com/2007/04/03/hibernate-pitfalls-part-2/
最佳答案
您可以运行 get on foo 将其放入 hibernate session 中,然后将其替换为您在其他地方创建的对象。但要使其发挥作用,您必须知道对象的所有 id,以便 Hibernate 看来这些 id 是正确的。
关于java - Hibernate事务处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/244381/