<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 修改sessionfactory的默认值 -->
<param-name>sessionFactoryBeanName</param-name>
<param-value>sFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
OpenSessionInViewFilter的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定
这样就能得到同一个session
如果没有配置OpensessionInView,HibernateTemplete里的方法每次都是新开一个session,执行完关闭session
假设在你的应用中Hibernate是通过spring 来管理它的session.而且在你的应用中没有使用OpenSessionInViewFilter,
session会在transaction结束后关闭.如果采用了spring的声明式事务模式,
它会对你的被代理对象的每一个(services)方法进行事务包装(AOP的方式)。
如下:
AOP 切的是service中的方法
//EmpDaoImpl中两个打开session方法,测试是否是同一session
private SessionFactory sf;
public void openSession1(){
Session session1= sf.getCurrentSession();
System.out.println(session1.hashCode());
}
public void openSession2(){
Session session2= sf.getCurrentSession();
System.out.println(session2.hashCode());
}
//OpenSessionService单独调用impl中的方法
private IEmpDao iEmpDao;
public void SessionTest1(){
iEmpDao.openSession1();
//iEmpDao.openSession2();
}
public void SessionTest2(){
iEmpDao.openSession2();
}
//SessionAction简单调用
private IOpenSessionServices openSS;
public String getSession(){
openSS.SessionTest1();
openSS.SessionTest2();
return null;
}
当web 访问SessionAction类的getsession()方法时,如果没有在web.xml中设置 OpenSessionInViewFilter 。
会得到两个不同的session;当你在web.xml中配置了OpenSessionInViewFilter,而结果就不一样