Spring整合hibernate,session什么时候关闭

Posted z_java_20150812

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring整合hibernate,session什么时候关闭相关的知识,希望对你有一定的参考价值。

<bean id="sessionFactory_hotelbeds" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource_hotelbeds" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.hbm2ddl_auto">$hibernate.hbm2ddl_auto</prop>
				<prop key="hibernate.dialect">$hibernate.dialect.oracle</prop>
				<prop key="hibernate.show_sql">$hibernate.show_sql</prop>
				<prop key="hibernate.format_sql">$hibernate.format_sql</prop>
				<prop key="hibernate.current_session_context_class">$hibernate.current_session_context_class</prop>
			</props>
		</property>
	</bean>

hibernate.current_session_context_class的属性值为:org.springframework.orm.hibernate4.SpringSessionContext,由spring来管理session。

<filter>
		<filter-name>openSessionInViewFilter</filter-name>
		<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
		<init-param>
			<param-name>singleSession</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInViewFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>

说明一下Open Session in View的作用,就是允许在每次的整个request的过程中使用同一个hibernate session,可以在这个request任何时期lazy loading数据。 
如果是singleSession=false的话,就不会在每次的整个request的过程中使用同一个hibernate session,而是每个数据访问都会产生各自的seesion,等于没有Open Session in View. 
OpenSessionInViewFilter默认是不会对session 进行flush的,并且flush mode 是 never 。

这会出现,在一次请求中,先后调用了service方法A,service方法B,在这两个方法中,是同一个session。如果方法A修改了一条数据,那么在方法B中去查询这条数据,并不是从数据库中查询的,而是从session缓存中取的,因此取到的不是最新数据(取到的是修改之前的数据)。

以上是关于Spring整合hibernate,session什么时候关闭的主要内容,如果未能解决你的问题,请参考以下文章

SSH框架系列之 Spring 整合 Hibernate 框架

Spring 学习之二(Spring 和 hibernate 整合)

ssh整合,从hibernate那个版本开始需要open session in view 才能开启事务?

java深入探究12-框架整合

hibernate初探之接口说明,session使用

SSH框架搭建 Spring + Struts + Hibernate