前言:对Hibernate出现NoSession问题进行分析和解决。
一、问题分析
1、为什么会出现NoSession?
① 从字面理解NoSession的原因是没有获取到Session,那为什么获取不到Session了,通常在Service层中所有Dao层操作完毕提交事务后,Session就会被关闭。在此时如果再次执行Dao层操作就必须获取Session,但是Session已经关闭所有就会报NoSession。
2、为什么会出现Dao查询之后会再次出现Dao操作呢?
在Hibernate中的五种查询方式的OID方式中有get()和load()两方法,其中load()方法为延迟加载。延迟加载就是在使用到数据的时候才会去发Sql查询,而使用load()方法查询就是这种情况,只有你使用到你要查询的数据对象时才会发送Sql。
二、解决方案
1、既然是延迟加载那么就可以让其立即加载使用get()方法,但是并不适用。因为立即加载会使一次查询时间较长,影响查询效率。
2、在web.xml中配置View层获取当前线程绑定Session的过滤器。
<!-- 在View层获取当前线程绑定的Session -->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>