我们在使用Hibernate的lazy load来优化性能的时候,只要Session关闭后再试图访问未被载入的对象时,
就会出现异常。通常使用在事务之内来访问数据是适合的,但是有时候我们需要强制载入这些数据,例
如在Web视图中访问这些模型对象。
  在业务层强制载入这些数据,通常不是很好的解决方案,因为不同的视图在使用业务方法的时候,需要的数据
通常不一样,这样业务方法可能绑定到特定的控制器中。
   在业务层上面增加一个Facade层来解决这个问题,同样也会增加一层不太必要的封装,增加了复杂性,POJO in Action一书中的例子就是这么设计的(POJO in Action感觉是本蛮不错的书),详细的可以看看这本书。
    通常Open Session in View模式相对来说是个不错的解决方案。事务在服务层结束,但关联的Hibernate Session保持打开状态,直到视图生成完成为止。这样及早的释放了数据库锁和连接,并且视图中可以通过lazy load来加载。
     Spring支持这种即开即用的模式,通过org.springframework.orm.hibernate.support.OpenSessionInViewFilter(可以和任何web层技术一起使用)或者OpenSessionInViewInterceptor(和Spring的Web MVC框架一起使用)。
Spring的这两种实现,他们支持两种操作方式:单一会话模式和延迟关闭模式
1、单一会话模式:
通过在请求范围的Session上来操作事务,单个Hibernate Session将用于整个HTTP请求。
默认情况下是单一会话方式,它是Open Session in View比较有效的版本。请求范围内的Hibernate Session视为第一级缓存,整个请求内只载入每个持久性对象一次。主要的缺点是:所有的Session管理的对象都必须是唯一的,这样视图从HttpSession中重新attach一个对象,可能导致Hibernate重复对象的异常。
2、延迟关闭方式:
每个事务将和平常一样使用其自身的Session,但这些Session中的每一个都在事务完成后保持开启,在视图生成后关闭。这样可以通过使用新的Hibernate Session来避免重复对象的问题,所有Session都在事务完成后保持开启,在他们每个上允许lazy load。但是,如果单个持久性对象涉及到多个事务,可能导致问题。Hibernate需要一个持久化对象与一个Hibernate Session关联,而不是同时与多个。这种情况下应该使用单一会话模式。
在web.xml中配置:

< filter >
   < filter-name > OpenSessionInView </ filter-name >
   < filter-class > org.springframework.orm.hibernate.support.OpenSessionInVewFilter </ filter-class >
<!-- 如果使用延迟关闭方式
  <init-param>
    <param-name>singleSession</param-name>
    <param-value>false</param-value>
  </init-param>
-->
</ filter >

< filter-mapping >
   < filter-name > OpenSessionInView </ filter-name >
   < url-pattern > *.do </ url-pattern > <!-- 以.do结束的的url为例 -->
</ filter-mapping >

OpenSessionInViewInterceptor的配置Spring Web MVC:

< bean  id ="openSessionInView"  class ="org.springframework.orm.hibernate.support.OpenSessionInViewInterceptor" >
  < property  name ="sessionFactory" >
    < ref  bean ="sessionFactory" >
  </ property >
<!-- 如果使用延迟关闭方式
 <property name="singleSession">
   <value>false</value>
 </property>
-->
</ bean >

< bean  id ="myUrlMapping"  class ="org.springframeword.web.servlet.handler.SimpleUrlHandlerMapping" >
   < property  name ="interceptors" >
     < list >
       < ref  bean ="openSessionInView" >
     </ list >
   </ property >
   < property  name ="urlMap" >
     <!--  url mappings -->  
  </ property >
</ bean >

Open Session in View相关推荐

  1. open Session In View和过滤器配置

    Open Session In View模式的主要思想是:当Web Request(浏览器请求)开始时,自动打开Session,当Web Request结束时,自动关闭Session.也就是说,Ses ...

  2. open session and Hibernate事务处理机制

    相关文章: Hibernate入门 - Transaction 使用OpenSessionInView模式时的一个异常问题解决方法 推荐圈子: 青岛javaeye 更多相关推荐 在没有使用Spring ...

  3. 【Session】Tomcat中Session持久化到文件系统或数据库

    参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化.共享也不太 ...

  4. Lumen中启用session

    原文链接:http://www.jianshu.com/p/dc33f8ab0618 Lumen5.2 的Release Notes中官方明确的指出Lumen专注于构建无状态API,JSON API ...

  5. 将登录等信息保存到session中和退出session

    做项目时,可能会将某些信息保存在session中,如登录等信息,这样方便在某些页面使用这些保存的信息. 要想保存这些信息,需要创建一个类,该类里面定义需要保存的变量等信息,当登录后就通过new一个该类 ...

  6. [K/3Cloud] 调用其他界面时通过Session传递对象参数

    DynamicFormShowParameter参数的CustomParams参数列表只支持string类型的参数,对于复杂参数的传递需要通过单据View对象的共享Session来完成,如: 在调用界 ...

  7. PHP函数源码之SESSION实现机制

    Session是以扩展的形式嵌入到PHP内核的,所以我们可以把Session当成扩展来看待. 一般扩展被载入到PHP会经过下面几个过程 [cpp] view plaincopy #define PHP ...

  8. [精]Odoo 8.0深入浅出开发教程-模块开发基础

    參考资料点击这里. 构建Odoo模块 模块组成 业务对象 业务对象声明为Python类, 由Odoo自己主动加载. 数据文件 XML或CSV文件格式, 在当中声明了元数据(视图或工作流).配置数据(模 ...

  9. 使用FortJs使用现代JavaScript开发Node.js

    介绍 (Introduction) Nodejs gives you the power to write server side code using JavaScript. In fact, it ...

最新文章

  1. 20165303我期望的师生关系
  2. 正则 ?= 和 ?= 用法 以及零宽断言等概念
  3. TIMING_05 VIVADO环境下的时序约束 之 基本时钟周期约束
  4. 五、华为鸿蒙HarmonyOS应用开发之Java开发模式下的同一个 Page 里实现页面跳转时无参(有参)传递、回值详解
  5. 重新拎一遍js的正则表达式
  6. Identity Server 4 原理和实战(完结)_建立Angular 客户端
  7. 教你炒股票21:缠中说禅买卖点分析的完备性
  8. 【维修】【硬件】【苹果】wifi芯片被加密
  9. Android编译gradle提示A problem occurred evaluating project ':example'.
  10. [Android6.0][MTK6737] 修改默认允许位置来源第三方应用安装
  11. 7z和winrar命令行压缩方法
  12. Mac安装jekyll踩坑
  13. 拥有十多年欧美金融行业经验,他曾任硅谷Top2互联网金融公司Prosper核心高管,突然回国,究竟是为何?
  14. 最近在读的一些文章-2019.04
  15. 驱动谷歌浏览器执行用例时报错java.lang.IllegalStateException
  16. TCAM CAM 说明 原理 结构 Verilog 硬件实现
  17. 总在说双亲委派,但双亲委派是什么,双亲委派和类加载的关系,简单讲解
  18. 电商系统-优惠券部分设计
  19. 淘宝二维码对网店推广的好处
  20. LYSoft之QQ去广告+本地会员外挂原理

热门文章

  1. Linux的hdparm工具参数详解:硬盘检查、测速、设定、优化
  2. 可跨异构数据存储系统——数据集成平台使用教程
  3. 详解GPFS文件系统架构、组网和Building Block。
  4. 微信公众平台开发总结
  5. 经典重读《信号与系统》-第六章
  6. web安全常见攻击方式及原理
  7. 2021年低压电工试题及答案及低压电工复审模拟考试
  8. 零基础怎么学手绘,多久能学会?
  9. 分享到QQ空间、新浪微博、腾讯微博和人人网
  10. Weblogic历史漏洞复现