about hibernate lazy load and solution

 

about hibernate lazy load is that used when loaded again.it can increase efficienty and sava memory..each on a database operation will open a new one session..then immediately shut down

比如在我们的应用中,user->post形成一对多的映射,User中有一个包含post的List。
在User中,有多个属性:name,password,phone等,还有一个List类型的posts。当我们对posts使用lazy laoding的时候,hibernate会在获得User对象的时候,仅仅返回name,password,phone等基本属性,当你访问posts的时候,它才会从数据库中提取posts需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session已经close了,再进行lazy loaiding就会有异常

解决方案

  1)、关闭延迟加载特性。
    操作起来比较简单,因为hibernate的延迟加载特性是在hbm配置里面可控制的。默认lazy="true",改为lazy="false"就可以了。
    但是使用这个解决办法带来的隐患是十分大的。
    首先,出现no session or session was closed就证明了您已经在使用外键关联表,如果去掉延迟加载的话,则表示每次查询的开销都会变得十分的大,如果关联表越多,后果也可以想象得到。所以不建议使用这个方法解决。

 2)、OpenSessionInView模式

   把session的周期交给servlet filter来管理,每当有request进来,就打开一个session,response结束之后再关闭它,这样可以让session存在于整个请求周期中。OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开 Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。

    由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个 LazyLoad的Exception。所以为了解决这个问题,Spring引入了这个Filter,使得Hibernate的Session的生命周期变长。
    有两种方式可以配置实现OpenSessionInView,分别是 OpenSessionInViewInterceptor和OpenSessionInViewFilter,

<beans><br />
  <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"><br />
  <property name="sessionFactory"><br />
  <ref bean="sessionFactory"/><br />
  </property><br />
  </bean><br />
  <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><br />
  <property name="interceptors"><br />
  <list><br />
  <ref bean="openSessionInViewInterceptor"/><br />
  </list><br />
  </property><br />
  <property name="mappings"><br />
  ......<br />
  </property><br />
  </bean><br />
  ......<br />
  </beans> 

 

posted @ 2015-11-19 22:45  俗家弟子  阅读(277)  评论(0编辑  收藏  举报