首先要在工程的web.xml中配置如下:
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframeword.orm.hibernate3.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactoryClientManage</param-value>
</init-param>
</filter>
这里配置的时候涉及到两个初始化的参数,其中singleSession为true可保证如果获取当前线程绑定的session没有获取到的话,可以重新创建一个(细节大家可以看下相关API或者是源码)。看网上好多相关的说法突出说明一定要配置singleSession为true,实际上在源码中,这个属性默认就是为true的。
另外还有一个sessionFactoryBeanName这个属性,这个属性是指定通过哪个sessionFactory去获得session的。默认情况下,会在Spring管理的Bean中去查找ID为sessionFactory的sessionFactory配置,如果你在开发的过程中指定了其它的ID名称,那么在这里一定要记住进行配置。要不就会报找不到那个bean的错误。
好了,接下来我们就可以用这个拦截器去过滤我们的servlet了
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<servlet-name>这里加入你要过滤的servlet名称</servlet-name>
</filter-mapping>
OK,现在好了,我们可以用了。
用这个的时候经常遇到一些问题如下:
打开的session是否要自己关闭:这个是不用的,上面指定的filter打开session,同时在完成请求之后会把这个session关掉的,所以自己不用关心这个。
通过session.openConnection()方法打开的connection要自己关闭吗,其实一般来说,自己打开的资源是需要自己关闭的,
但是这里的connection并不是自己打开的,如果使用了连接池的话,session用完的connection会回到池中的,这个会由连接池去管理,所以自己也不用操心(这个只是自己的理解,不知道对不对)。
好了,这个就写到这,大家有什么想法一起交流,谢谢!