Hibernate -- NoSession问题分析和解决

前言:对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>

猜你喜欢

转载自blog.csdn.net/m0_37602117/article/details/79771460