HibernateTransactionManager - 将Hibernate会话从指定的工厂绑定到线程,可能允许每个工厂一个线程绑定的会话
OpenSessionInViewFilter - 此过滤器通过当前线程使Hibernate会话可用,该线程将由事务管理器自动检测。
它们之间有什么区别以及它们应该在什么情况下使用?
答案 0 :(得分:-1)
OpenSessionInViewFilter
现在,当您使用OpenSessionInViewFilter
时,默认情况下会话的刷新模式设置为NEVER。因此,当您尝试使用hibenate保存操作中的某些内容并将其提交时,它不会反映在您的数据库中。要解决此问题,您需要在操作类中刷新会话或扩展OpenSessionInViewFilter
并覆盖closeSession(Session session, SessionFactory sessionFactory)
。
现在,您还可以为每个请求维护单个事务。在您的操作中,您可以编辑对象的属性并使用session.update(object)
进行更新。但它还没有被提交,因为剩下一些其他处理。同时,其他一些请求正在调用一个尝试检索您正在更新的对象的操作。由于对象尚未提交,因此其他请求将获取旧对象。要解决此问题,您需要在加载对象之前开始事务,并在更新对象后提交事务。因此,只要对象为saved/updated
,它就会被提交。有了这个,单个用户请求中可以有很多事务,但只有一个会话。
OpenSessionInView
模式仅保证在单个线程执行期间会话处于打开状态。
当页面已经呈现并且已经返回到浏览器时,过滤器将关闭会话。
因此,后续请求(例如导航请求)需要另一个由OpenSessionInViewFilter
打开的新会话。但作为" old" person对象未连接到" new"会话,它被认为是不连续的对象,它的引用不能懒惰加载。