`

关于Hibernate的lazy load以及OpenSessionInView

阅读更多
HIBERNATE的持久化对象加载策略。
延迟加载, 也就是用到的时候才去加载.这样可以提高一些性能.
Hibernate的lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是hibernate.org并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。

比如在我们的应用中,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就会有异常。
解决办法是在close session之前,调用Hibernate.initialize(user.getPosts()),告诉系统,user.getPosts()是需要lazy laoding的。但是这样做会破坏HibernateSession类的封装.


后来采用所谓的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,功能完全相同,只不过一个在 web.xml配置,另一个在application.xml配置而已。我个人比较倾向配置在application.xml里,因为web.xml里配置的东西的太多的话容易发生冲突,虽然可以调整,但是毕竟多了个麻烦。

以下是OpenSessionInViewInterceptor配置

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

以下是OpenSessionInViewFilter配置:

view plaincopy to clipboardprint?
<web-app> 
  ......  
  <filter> 
  <filter-name>hibernateFilter</filter-name> 
  <filter-class> 
  org.springframework.orm.hibernate3.support.OpenSessionInViewFilter  
  </filter-class> 
  <init-param> 
  <param-name>singleSession</param-name> 
  <param-value>true</param-value> 
  </init-param> 
  </filter> 
  ......  
  <filter-mapping> 
  <filter-name>hibernateFilter</filter-name> 
  <url-pattern>*.do</url-pattern> 
  </filter-mapping> 
  ......  
  </web-app> 



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Jermaine/archive/2009/02/01/3857140.aspx
分享到:
评论

相关推荐

    gilead hibernate lazyload例子

    Hibernate 的 lazyload 在FLEX中的解决方法例子 用的是gilead 因为LIB包太大上传很慢所以被我删掉了。

    jQuery.lazyload.js

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多...

    jQuery_lazyload

    jQuery_lazyload插件示例Demo

    lazyload延迟加载

    Lazyload是通过延迟加载来实现按需加载,达到节省资源,加快浏览速度的目的。 网上也有不少类似的效果,这个Lazyload主要特点是: 支持使用window(窗口)或元素作为容器对象; 对静态(位置大小不变)元素做了大量...

    jquery.lazyload.min.js

    jquery.lazyload.min.js插件 直接下载引入即可~~~~~~~

    Node.js-一个组件实现lazyload图片当在视窗内(或附近)时才加载

    一个组件实现lazyload图片当在视窗内(或附近)时才加载

    lazyload-2.x.zip

    lazyload-2.x 最新版本包括api使用

    版本:lazyload1.9.3..js

    lazyload1.9.3,图片延迟随滚动条显示。$(function() { $("img.lazyload").lazyload()});

    lazyload-JavaScript

    lazyload, JavaScript, 图片懒加载, h5

    Lazyload应用案例

    图片懒加载lazyload,增快页面访问速度。

    懒加载lazyload

    优化网站加载速度,使用lazyload.js,有完整的demo,有jquery.lazyload.js和jquery-1.11.0.min.js

    懒加载案例lazyload

    懒加载案例 lazyload 自己做了一个懒加载的案例,供大家参考

    jquery.lazyload.js

    使用jQuery.Lazyload的优点 提高页面加载速度。 网页图片挨个渐显,非常美观。

    lazyload使用案例及DEMO

    lazyload使用案例及DEMO,里面包含了lazyload.js,一些测试图片,jquery.js。开箱即用!2020.06.22更新降低下载积分需求,我个人原意是免费下载的,奈何网站规则不允许!

    lazyload技术内幕

    lazyload技术内幕,当下最流行的图片浏览技术

    jquery_lazyload-master.zip

    jquery_lazyload-master.zip 类似新浪微博 的图片懒加载,非常实用jquery_lazyload-master.zip 类似新浪微博 的图片懒加载,非常实用jquery_lazyload-master.zip 类似新浪微博 的图片懒加载,非常实用jquery_lazy...

    JQuery Lazyload加载图片实例

    JQuery Lazyload加载图片实例

    LazyLoad实例

    LazyLoad页面加载技术实例,根据页面滚动加载图片

    动态加载的图片LazyLoad

    用于显示动态加载的图片如何通过JQuery.LazyLoad控件实现延迟加载,可惜目前例子在谷歌浏览器下还有些问题

    JQuery LazyLoad 图片懒加载实例

    JQuery LazyLoad 图片懒加载实例,相关描述可查看我的博文“JQuery.LazyLoad 实现图片懒加载”

Global site tag (gtag.js) - Google Analytics