java - Hibernate事务处理问题

标签 java hibernate spring

我们正在使用 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/

相关文章:

java - Spring MVC 3 AJAX

java - Oracle日期格式的实现

java - 浏览器特定的 session 管理

java - 属性(property)访问。 getter 中的逻辑

java - Hibernate, MySQL - 数据截断 : Data too long for column exception message

Java Spring - 在运行时添加和删除过滤器

java - Ehcache分布式多 channel

java - 设备支持删除了在 Playstore Android 上更新应用程序时出现的警告

java - 如何使用字符串中的本地日期检查 X 天是否已经过去

java - org.hibernate.QueryException : could not resolve property: is_approved of: com