HibernateTransactionManager和OpenSessionInViewFilter之间的区别

时间:2014-08-20 18:07:57

标签: java spring hibernate spring-mvc transactions

来自文档 - http://docs.spring.io/spring-framework/docs/2.0.x/api/org/springframework/orm/hibernate/HibernateTransactionManager.html

HibernateTransactionManager - 将Hibernate会话从指定的工厂绑定到线程,可能允许每个工厂一个线程绑定的会话

OpenSessionInViewFilter - 此过滤器通过当前线程使Hibernate会话可用,该线程将由事务管理器自动检测。

它们之间有什么区别以及它们应该在什么情况下使用?

1 个答案:

答案 0 :(得分:-1)

OpenSessionInViewFilter

现在,当您使用OpenSessionInViewFilter时,默认情况下会话的刷新模式设置为NEVER。因此,当您尝试使用hibenate保存操作中的某些内容并将其提交时,它不会反映在您的数据库中。要解决此问题,您需要在操作类中刷新会话或扩展OpenSessionInViewFilter并覆盖closeSession(Session session, SessionFactory sessionFactory)

现在,您还可以为每个请求维护单个事务。在您的操作中,您可以编辑对象的属性并使用session.update(object)进行更新。但它还没有被提交,因为剩下一些其他处理。同时,其他一些请求正在调用一个尝试检索您正在更新的对象的操作。由于对象尚未提交,因此其他请求将获取旧对象。要解决此问题,您需要在加载对象之前开始事务,并在更新对象后提交事务。因此,只要对象为saved/updated,它就会被提交。有了这个,单个用户请求中可以有很多事务,但只有一个会话。

OpenSessionInView模式仅保证在单个线程执行期间会话处于打开状态。 当页面已经呈现并且已经返回到浏览器时,过滤器将关闭会话。

因此,后续请求(例如导航请求)需要另一个由OpenSessionInViewFilter打开的新会话。但作为" old" person对象未连接到" new"会话,它被认为是不连续的对象,它的引用不能懒惰加载。

相关问题