`

关于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
分享到:
评论

相关推荐

    hibernate面试题总结

    Hibernate是Java领域中一款流行的持久...以上就是Hibernate面试中常见的问题和答案,涵盖了基本概念、缓存策略、查询方式以及事务和数据访问等方面的知识点。理解并掌握这些内容对于深入学习和使用Hibernate至关重要。

    struts+spring+hibernate面试题

    在Java Web开发中,Struts、Spring和Hibernate是最常见的三大框架,它们...以上就是关于Struts、Spring和Hibernate面试题的详细解析,涵盖了这三大框架的关键概念和使用技巧,对于理解和解答相关面试问题非常有帮助。

    java程序员ssh面试常见题

    Hibernate中lazy loading的概念及openSessionInView模式 - **知识点概述**:Lazy Loading是一种延迟加载策略,而OpenSessionInView模式则是在整个请求周期内保持Session打开的状态。 - **详细解释**: - **Lazy ...

    Java框架面试题

    7. **延迟加载与OpenSessionInView**:延迟加载(Lazy Loading)意味着关联对象在需要时才加载,而OpenSessionInView过滤器确保在HTTP请求生命周期内保持Session打开,以支持延迟加载。 8. **Spring事务管理**:...

    2023年大数据面试题剖析.doc

    2023年大数据面试题剖析.doc

    那曲市乡镇边界,矢量边界,shp格式

    矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用

    《基于YOLOv8的食品冷链运输车厢门开关次数统计系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    2023年计算机2级CCT2photoshop考试习题.doc

    2023年计算机2级CCT2photoshop考试习题.doc

    2023年自考自动化制造系统数控铣削.doc

    2023年自考自动化制造系统数控铣削.doc

    2023年广东省计算机等级考试二级笔试试卷VB最新考试试题库.docx

    2023年广东省计算机等级考试二级笔试试卷VB最新考试试题库.docx

    2023年新版计算机考试试题及答案.docx

    2023年新版计算机考试试题及答案.docx

    GSM和CDMA数字蜂窝移动通信系统介绍.pptx

    GSM和CDMA数字蜂窝移动通信系统介绍.pptx

    考虑电流互感器饱和特性时的建模与仿真

    考虑电流互感器饱和特性时的建模与仿真 本仿真模型基于MATLAB/Simulink(版本MATLAB 2016Rb)软件。建议采用matlab2016 Rb及以上版本打开。(若需要其他版本可联系代为转换)

    工业自动化中欧姆龙NJ系列PLC模切机的十二轴伺服运动与张力控制解析

    内容概要:本文深入探讨了欧姆龙NJ系列PLC在模切机项目中的应用,重点介绍了十二轴EtherCAT总线伺服运动控制和张力控制系统的设计与优化。文章首先讲解了运动控制部分,包括轴使能、回零操作、加减速曲线配置以及凸轮追剪功能的实现。接着讨论了张力控制中的PID调节、卷径计算及其滤波处理方法。此外,还涉及了纠偏控制中的模拟量处理和抗干扰措施。文中强调了模块化编程的重要性,并分享了许多实战经验和调试技巧。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程、伺服控制和张力控制感兴趣的读者。 使用场景及目标:适用于希望深入了解PLC编程、伺服运动控制和张力控制原理的专业人士。目标是帮助读者掌握复杂的多轴联动系统设计,提高故障排查能力和系统优化水平。 其他说明:文章不仅提供了详细的代码示例,还分享了作者在实际项目中积累的技术心得和解决方案,有助于读者更好地理解和应用于实际工作中。

    Python实践:人工智能搜索、优化与学习

    本书旨在教育读者理解人工智能领域的核心算法机制,包括搜索、优化和学习。作者通过十个经典问题,展示了如何应用这些基本算法来解决实际问题。书中不仅提供理论知识,还通过实例教授读者如何选择和实现适当的算法。本书适合初学者和资深从业者,旨在帮助他们区分和选择适合特定问题的算法。书中包含的十个问题涵盖了滑动拼图、最短路径、数独、四子棋、俄罗斯方块、贪吃蛇、垃圾邮件识别、信贷规则、新闻分类和动物识别等。作者Hugues Bersini和Ken Hasselmann分别来自布鲁塞尔自由大学和ECAM,他们在人工智能领域有着丰富的教学和研究经验。

    2023年春北交计算机安全与保密在线作业二.doc

    2023年春北交计算机安全与保密在线作业二.doc

    基于Matlab的卫星轨道设计库.zip

    matlab

    万年历,真的很好内含原理图和原程序代码.zip

    万年历,真的很好内含原理图和原程序代码.zip

    WinCC嵌入式Excel报表系统:实现高效自动化报表生成与数据处理

    内容概要:本文详细介绍了WinCC嵌入式Excel报表系统的功能和优势。该系统利用VBS脚本和Excel模板相结合的方式,能够直接从WinCC的变量归档库中读取数据并生成高质量的报表。文中展示了多种实用的代码示例,如读取历史数据、处理不同类型的统计数据(实时值、平均值、累计值)、以及将Excel控件嵌入WinCC界面的方法。此外,还讨论了如何通过模板机制灵活定制报表样式,确保数据质量和异常处理的有效性。系统不仅支持多版本兼容,而且降低了学习门槛,使得即使是初学者也能轻松上手。 适合人群:从事工业控制系统开发与维护的技术人员,尤其是那些需要频繁处理报表任务的工程师。 使用场景及目标:适用于需要从WinCC系统中提取和展示数据的各种场合,如生产数据分析、设备监控等。主要目标是提高工作效率,减少人工干预,提升数据处理的准确性和及时性。 其他说明:该系统的优势在于其易用性和灵活性,用户可以通过简单的模板修改来满足不同的报表需求,同时保持良好的性能和稳定性。

    MATLAB实现基于BWO-CNN-BiGRU-Attention白鲸优化算法(BWO)优化卷积神经网络(CNN)和双向门控循环单元(BiGRU)结合注意力机制时间序列预测的详细项目实例(含完整的程序

    内容概要:本文档详细介绍了一项基于白鲸优化算法(BWO)优化卷积神经网络(CNN)和双向门控循环单元(BiGRU),结合注意力机制的时间序列预测项目。该项目旨在通过BWO优化CNN-BiGRU模型的超参数,提升模型的预测精度和泛化能力。项目涵盖了从数据预处理、模型构建、优化、训练到评估的全流程,并提供了详细的代码示例。模型通过CNN提取局部特征,BiGRU捕捉时间序列的长短期依赖,注意力机制聚焦关键时刻,BWO优化算法则确保模型参数的全局最优解。项目还讨论了如何应对时间序列预测中的非线性问题、过拟合、参数优化困难等挑战,并提出了相应的解决方案。 适合人群:具备一定机器学习和深度学习基础的研发人员,尤其是对时间序列预测感兴趣的从业者和技术爱好者。 使用场景及目标:①适用于金融、气象、能源、交通、医疗等多个领域的预测任务;②通过优化模型结构和参数,提升预测精度和泛化能力;③结合注意力机制,增强模型对时间序列中关键特征的关注;④通过BWO优化算法,避免局部最优解,确保模型参数的全局最优。 其他说明:项目不仅提供了详细的理论背景和技术细节,还包括了完整的代码实现和GUI设计,方便用户直接应用和扩展。此外,项目还探讨了未来改进的方向,如增强模型的可解释性、多模态数据融合、在线学习功能等,以进一步提升模型的实用性和适应性。

Global site tag (gtag.js) - Google Analytics