OpenSessionInView

 <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,而结果就不一样



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值