在Java Web项目中使用Hibernate经常会遇到LazyInitializationException。这是因为controller和model层(java代码)将通过JPA的一些启用了延迟加载功能的领域(如用getRefrence()方法或者在关联关系中采用fetch=FetchType.LAZY)返回给view层(jsp代码)的时候,由于加载领域对象的JPA Session已经关闭,导致这些延迟加载的数据访问异常。

这时就可以使用OpenEntityManagerInViewFilter来将一个JPAsession与一次完整的请求过程对应的线程相绑定。请看一段伪代码:

ervice{ entitymanager=context.getEntityManager(); if(entitymanager==null) context.put(factory,createEntityManager()); entitymangager=context.getEntityManager(); entitymanager.begin(); public void find(Integer productid){//除了这个方法外,其他都是通过AOP织入的 em.getReference(Product.class,productid)); } entitymanager=context.getEntityManager(); entitymanager.commit(); entitymanager.close();
}

上面的伪代码演示了如果我们想调用我们自己定义的一个find()方法,spring会在该方法的前后织入一些代码来开始事物和关闭session。当view层调要用这个find()方法获取的对象(由于采用了延迟加载模式,只有到要使用到该对象的时候才会让session去数据库取)的时候,实际上session已经关闭了,不能再让session获取对象。OpenEntityManagerInViewFilter会让session一直到view层调用结束后才关闭,

如果发现配置完以后不起作用,请看另外一篇博客:http://whoosh.iteye.com/admin/blogs/1154924

Spring针对Hibernate的非JPA实现用的是OpenSessionInViewFilter,原理与这个大同小异。用了这类Filter以后会降低一定的运行效率,但是一般的web项目都会加入一些开源的缓存管理框架,这样一来,对效率的影响就变得很小了。

转载于:https://blog.51cto.com/amadis/1376670

Spring的OpenEntityManagerInViewFilter相关推荐

  1. ssh(Struts+spring+Hibernate)三大框架整合-简述

    ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...

  2. 《Spring 5 官方文档》18. Web MVC 框架(五)

    自定义WebDataBinder初始化 要通过Spring定制与PropertyEditor的请求参数绑定 WebDataBinder,可以使用@InitBinder控制器中的-annotated @ ...

  3. Why Spring Boot

    本文介绍将各种Spring的配置方式,帮助您了解配置Spring应用的复杂性. Spring是一个非常受欢迎的Java框架,它用于构建web和企业应用.不像许多其他框架只关注一个领域,Spring框架 ...

  4. Spring boot+Spring Security 4配置整合实例

    本例所覆盖的内容: 1. 使用Spring Security管理用户身份认证.登录退出 2. 用户密码加密及验证 3. 采用数据库的方式实现Spring Security的remember-me功能 ...

  5. java 持久化线程_java – Spring Hibernate Envers多线程 – 会话关...

    我们使用Hibernate(使用JPA)和Hibernate Envers来持久化对象的历史. Web应用程序运行许多线程,其中一些是通过其他应用程序的RMI方法调用创建的,其中一些是由应用程序本身创 ...

  6. springmvc jpa_使用JavaConfig的SpringMVC4 + Spring Data JPA + SpringSecurity配置

    springmvc jpa 在本文中,我们将看到如何使用JavaConfig配置和集成SpringMVC4,带有Hibernate的Spring Data JPA和SpringSecurity. 1. ...

  7. spring 测试 事务_Spring陷阱:事务测试被认为是有害的

    spring 测试 事务 Spring杀手级功能之一是容器内集成测试 . 尽管EJB多年来一直缺乏此功能(Java EE 6终于解决了这个问题,但是我尚未进行测试),但是Spring从一开始就允许您从 ...

  8. 使用JavaConfig的SpringMVC4 + Spring Data JPA + SpringSecurity配置

    在本文中,我们将看到如何使用JavaConfig配置和集成SpringMVC4,带有Hibernate的Spring Data JPA和SpringSecurity. 1.首先让我们在pom.xml中 ...

  9. 使用Spring Data REST将Spring Data JPA存储库导出为REST服务

    Spring Data模块提供了各种模块,以统一的方式处理各种类型的数据源,如RDBMS,NOSQL存储等. 在我以前的文章SpringMVC4 + Spring Data JPA +使用JavaCo ...

  10. Spring陷阱:事务测试被认为是有害的

    Spring杀手级功能之一是容器内集成测试 . 尽管EJB多年来一直缺乏此功能(Java EE 6终于解决了这个问题,但是我还没测试过),但是Spring从一开始就允许您从Web层开始,通过所有服务来 ...

最新文章

  1. xlwt写入单元格,xlrd读出单元格
  2. django url 中的namespace详解
  3. Expression Blend中文教程 - 开篇
  4. Flutter进阶第8篇:实现视频播放
  5. java中的ioc和aop_IOC和AOP分别是什么?如何理解?
  6. 常用的分类与预测算法
  7. matlab连续信号傅里叶变换,连续信号的傅里叶变换及matlab显示
  8. cpp封装dll和so,cpp调用so
  9. 《小岛经济学》读书笔记
  10. iTop-4412 裸机教程(一)- 从启动方式开始
  11. 智能化的Conversational UI是移动发展的一个趋势
  12. 一键帝国CMS快速重置管理员密码工具
  13. 运行tomcat 时报错,提示无法找到相关的jar包 Publishing failed with multiple errors Error reading file
  14. 阿里数据分析师笔试记录
  15. 微服务实施笔记(二)——搭建实验部署环境
  16. 秘辛:2019上半年程序员生存报告
  17. 通过idea的Git使主干项目合并到分支中(主干同步到分支)
  18. 【CS231n】十五、深度学习的高效算法和硬件设计_一只神秘的大金毛_新浪博客...
  19. PHP中css中文意思是,css中font-family是什么意思
  20. 20191005 (16)金融学课笔记(得到北大经融学课)——复利加速思维

热门文章

  1. [Surface] 在win8.1上使用QQ截图放大问题(解决办法)
  2. 【转】Python基础-字符串
  3. SQL with etc获取父节点或子节点总结
  4. ASP.NET中用healthMonitor属性用法
  5. MySQL中的if和case语句使用总结
  6. MySQL 数据查询
  7. Docker概念学习系列之详谈Docker 的核心组件与概念(5)
  8. 读《单页web应用》-回顾作用域
  9. [Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛
  10. 关于float与double区别