Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HibernateTransactionManager和OpenSessionInViewFilter之间的区别_Java_Spring_Hibernate_Spring Mvc_Transactions - Fatal编程技术网

Java HibernateTransactionManager和OpenSessionInViewFilter之间的区别

Java HibernateTransactionManager和OpenSessionInViewFilter之间的区别,java,spring,hibernate,spring-mvc,transactions,Java,Spring,Hibernate,Spring Mvc,Transactions,从文件中- HibernateTransactionManager—将指定工厂的Hibernate会话绑定到线程,可能允许每个工厂有一个线程绑定会话 OpenSessionInViewFilter-此筛选器使Hibernate会话通过当前线程可用,事务管理器将自动检测到该线程 它们之间的区别是什么?在什么情况下应该使用它们 OpenSessionInViewFilter 现在,当您使用OpenSessionInViewFilter时,会话的刷新模式默认设置为从不。因此,当您尝试使用hibena

从文件中-

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

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

它们之间的区别是什么?在什么情况下应该使用它们

OpenSessionInViewFilter
现在,当您使用OpenSessionInViewFilter时,会话的刷新模式默认设置为从不。因此,当您尝试使用hibenate在操作中保存某些内容并提交时,它不会反映在数据库中。要解决这个问题,您需要刷新action类中的会话,或者扩展OpenSessionInViewFilter并覆盖CloseSessionSessionSession会话SessionFactory SessionFactory

现在,您还可以为每个请求维护一个事务。在操作中,编辑对象的属性,并使用session.updateobject对其进行更新。但由于还有其他一些处理程序,因此尚未提交。同时,另一个请求正在调用一个操作,该操作试图检索您正在更新的对象。由于对象尚未提交,其他请求将获取旧对象。要解决这个问题,您需要在加载对象之前开始事务,并在更新对象之后提交事务。这样,一旦对象被保存/更新,它就会被提交。这样,在单个用户请求中可以有许多事务,但只有一个会话

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


因此,后续请求(如导航请求)需要另一个新会话,该会话将由OpenSessionInViewFilter打开。但由于old person对象未连接到新会话,因此它被视为断开连接的对象,其引用不能延迟加载。

您实际上错了。冲洗模式设置为手动而非从不。如果使用Spring的事务支持,HibernateTransactionManager会将其设置为自动,并在提交后再次重置。所以会发生冲洗。如果不是,则在应用程序的配置/设置中是一个错误。@M.Deinum from class注意:默认情况下,此筛选器不会刷新Hibernate会话,刷新模式设置为FlushMode.NEVER。它假定与关心刷新的服务层事务结合使用:在读写事务期间,活动事务管理器将临时将刷新模式更改为FlushMode.AUTO,并且在每个事务结束时将刷新模式重置为FlushMode.NEVER。如果您打算在没有事务的情况下使用此筛选器,请考虑通过FLUSMODE属性更改默认的刷新模式。