`

关于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懒加载(Lazy Load)机制的作用所在。懒加载是一种延迟加载策略,只在真正需要时才加载关联的数据,以减少内存消耗和提高响应速度。 Gilead,全称为Hibernate for Flex,是用于Flex和Hibernate之间...

    lazyload-2.x.zip

    《jQuery LazyLoad 2.x API详解与应用实践》 在当今网页开发中,为了提高页面加载速度和用户体验,"懒加载"(Lazy Load)技术变得越来越重要。jQuery LazyLoad插件是一个广泛使用的解决方案,它允许图片、iframe等...

    jquery.lazyload.js

    《jQuery.Lazyload.js:优化网页加载速度与用户体验的艺术》 在现代网页设计中,页面加载速度和用户体验是至关重要的因素。jQuery.Lazyload.js是一个高效实用的JavaScript插件,它能够显著提升网页加载速度,同时...

    JQuery Lazyload加载图片实例

    **jQuery Lazyload 图片...首先,你需要在项目中引入 jQuery 库以及 jQuery Lazyload 插件。你可以在官方网站或者通过 CDN(内容分发网络)获取它们的 JavaScript 文件。例如,在 HTML 文件中添加以下代码: ```html ...

    jQuery_lazyload

    下面我们将深入探讨jQuery_lazyload的工作原理、优势以及如何在项目中应用。 1. **工作原理**: jQuery_lazyload通过监听滚动事件来实现延迟加载。当用户滚动页面,使得原先不在视口内的图片或者其他元素进入视口...

    JQuery LazyLoad 图片懒加载实例

    对于需要懒加载的图片,我们需要在`&lt;img&gt;`标签上添加特定的类名(默认为`lazyload`)以及`data-src`属性,用于存储实际的图片URL。例如: ```html &lt;img class="lazyload" data-src="path/to/image.jpg" alt="图片...

    lazyload.js演示页面

    标题中的“lazyload.js演示页面”表明这是一个关于延迟加载技术的示例,主要使用了名为“lazyload.js”的JavaScript库。延迟加载,或称为懒加载,是一种优化网页性能的策略,它只在用户滚动到视口附近的图片或内容时...

    lazyload使用案例及DEMO

    **图片懒加载技术详解与"lazyload"使用案例** 在现代网页设计中,为了提高页面加载速度和用户体验,"图片懒加载"(Lazy Loading)技术得到了广泛应用。它是一种优化策略,仅在用户滚动到图像所在区域时才加载图片,...

    懒加载lazyload

    `tuupola-jquery_lazyload` 这个压缩包可能包含了这两个库的源代码以及相关的示例(demo),帮助开发者理解和使用这个插件。 要使用 `jquery.lazyload.js`,首先确保在页面中引入了 jQuery 和插件本身。通常,我们...

    jquery lazyload延时加载

    1. **图片未加载**:检查图片路径是否正确,占位符是否已设置,以及 LazyLoad 是否正确初始化。 2. **性能问题**:过多的图片可能会导致滚动性能下降,可以通过增加阈值或者分组加载来优化。 3. **刷新后图片丢失*...

    图片延迟加载 lazyload

    图片延迟加载(Lazy Load)是一种优化网页性能的技术,主要用于处理大量图片或多媒体资源的加载。在网页设计中,当用户滚动页面时,只有进入视口的图片才会开始加载,而那些还未显示出来的图片则会暂时保持占位符...

    jQuery.lazyload.js

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

    动态加载的图片LazyLoad

    动态加载,也称为延迟加载或懒加载,是一种优化网页性能的...通过查看和分析这个示例,你可以更深入地理解JQuery.LazyLoad的工作原理以及如何解决可能出现的问题。记得在本地环境中运行这个示例,以便于调试和测试。

    magento lazyload插件

    Magento LazyLoad 插件是针对Magento电子商务平台设计的一款性能优化工具。它的主要功能是实现图片的延迟加载(Lazy Load),以此提升网站的加载速度和用户体验。在网页浏览时,传统方式下所有图片会一次性全部加载...

    jQuery.lazyload-1.7.2

    jQuery.lazyload 是一个非常流行的JavaScript插件,专用于优化网页性能,通过实现图片的懒加载技术。这个插件的核心理念是延迟非视口内的图片加载,直到用户滚动页面并接近这些图片时才进行加载。这样可以显著减少...

    lazyload.js实现图片异步延迟加载

    在本文中,我们将深入探讨如何使用`lazyload.js`这个JavaScript库来实现这一功能。 ### 1. 懒加载原理 懒加载的基本原理是,当用户滚动页面时,只加载视口内的图片,而那些位于视口之外的图片则暂时不加载。当用户...

    图片延迟加载,lazyload.js使用实例

    在本文中,我们将深入探讨`lazyload.js`的工作原理、使用方法以及如何在实际项目中应用。 ### `lazyload.js`工作原理 1. **监听滚动事件**:`lazyload.js`通过监听浏览器的滚动事件,判断图片是否进入可视区域。 2...

    jquery.lazyload 实现图片延迟加载

    本文将详细介绍 `jQuery LazyLoad` 的工作原理、使用方法以及如何将其应用到实际项目中。 ### 一、什么是延迟加载 延迟加载(Lazy Loading)是指仅加载用户可视区域内的资源,当用户滚动页面时,浏览器才会加载...

    lazyload延迟加载

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

Global site tag (gtag.js) - Google Analytics