Spring的OpenEntityManagerInViewFilter
在Java Web项目中使用Hibernate经常会遇到LazyInitializationException 。这是因为controller和model层(java代码)将通过JPA的一些启用了延迟加载功能 的领域(如用getRefrence() 方法或者在关联关系中采用fetch=FetchType.LAZY )返回给view层(jsp代码)的时候,由于加载领域对象的JPA Session已经关闭,导致这些延迟加载的数据访问异常。
这时就可以使用OpenEntityManagerInViewFilter来将一个JPAsession与一次完整的请求过程对应的线程相绑定。请看一段伪代码:
- Service{
- 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层调用结束后才关闭,请看下面的伪代码:
- Filter{
- doFilter(chain){
- context.getEntityManager().open();
- chain.doFilter(req,res){
- xxxAction{
- execute(){
- Product product=service.find(productid);//此时该对象为游离状态,实际上并没有在数据库获得值。
- req.setAttibute("Product",produxt);//这时候才到数据库里面去取值
- return mapping.findForward("product");
- }
- }
- }
- context.getEntityManager().close()...
- }
- }
如果没使用OpenEntityManagerInViewFilter,session会在service.find()方法后就被关闭,用了以后session在整个view层结束后才关闭。
配置该filter的方法:在web.xml文件中加入如下代码
- <filter>
- <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
- <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
- <init-param>
- <!-- 指定org.springframework.orm.jpa.LocalEntityManagerFactoryBean在spring配置文件中的名称,默认值为entityManagerFactory
- 如果LocalEntityManagerFactoryBean在spring中的名称不是entityManagerFactory,该参数一定要指定,否则会出现找不到entityManagerFactory的例外 -->
- <param-name>entityManagerFactoryBeanName</param-name>
- <param-value>entityManagerFactory</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
如果发现配置完以后不起作用,请看本人另外一篇博客:http://whoosh.iteye.com/admin/blogs/1154924
Spring针对Hibernate的非JPA实现用的是OpenSessionInViewFilter,原理与这个大同小异。用了这类Filter以后会降低一定的运行效率,但是一般的web项目都会加入一些开源的缓存管理框架,这样一来,对效率的影响就变得很小了。
Spring的OpenEntityManagerInViewFilter的更多相关文章
- 快速搭建springmvc+spring data jpa工程
一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...
- web.xml中openEntityManagerInViewFilter的作用(转)
<filter> <filter-name>openEntityManagerInViewFilter</filter-name> <filter-class ...
- JPA && Spring Data && Spring Data JPA
1.JPA Java Persistence API,用于对象持久化的一组API,JPA本身是一组规范,让开发者用同一种方式访问不同的ORM框架.其实也就是java实体对象和关系型数据库建立起映射关 ...
- struts2+hibernate-jpa+Spring+maven 整合(2)
1.修改pom.xml 1. 添加 slf4j-api <dependency> <groupId>org.slf4j</groupId> <artifac ...
- Hibernate + Spring (quartz) 整合懒(延迟)加载问题
开发项目的时候 在一个Job中执行了数据库操作, 用的是懒加载,但是如下错误 org.hibernate.LazyInitializationException: failed to lazily i ...
- spring data jpa使用懒操作
如果model对象的某属性使用lazy load,调用这个属性时会报错, failed to lazily initialize a collection of role could not init ...
- 为什么是Spring Boot
原文:https://dzone.com/articles/why-springboot 作者:Siva Prasad Reddy Katamreddy 译者:Oopsguy 本文介绍将各种Sprin ...
- Spring、SpringMVC、SpringData + JPA 整合详解
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7759874.html ------------------------------------ ...
- sssp-springmvc+spring+spring-data-jpa增删改查
环境:IDE:eclipse.jdk1.7.mysql5.7.maven 项目结构图 上面目录结构你可以自己创建 搭建框架 首先加入maven依赖包以及相关插件 <dependencies> ...
随机推荐
- 今天就注册上海ORACLE2用户组014在峰会酒吧!
COLLABORATE 14 – SHOUG Forum 上海ORACLE用户组2014年高峰论坛报名本次活动由ORACLE ACS高级服务部门与 SHOUG 上海ORACLE用户组合办. 大会议程包 ...
- systemTAP 学习
http://blog.csdn.net/moonvs2010/article/category/1570309
- python模拟登陆之下载
好长时间没有更新博客了,哈哈. 今天公司给了这么一个需求,现在我们需要去淘宝获取上一天的订单号,然后再根据订单号去另一个接口去获取订单详情,然后再给我展示到web! 中间涉及到的技术点有: 模拟登陆 ...
- Entity Framework CodeFirst------使用CodeFirst方式建立数据库连接(一)
本文分步演练介绍通过 Code First 开发建立新数据库.这个方案包括建立不存在的数据库(Code First 创建)或者空数据库(Code First 向它添加新表).借助 Code First ...
- iOS UIKit:viewController之定义(2)
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- 一致性哈希(Consistent Hash)
http://blog.csdn.net/cywosp/article/details/23397179/ http://www.codeproject.com/Articles/56138/Cons ...
- 10.29 morning
WPS转word太丑了 凑合看喽 第二题 [题目描述] 给你两个日期,问这两个日期差了多少毫秒. [输入格式] 两行,每行一个日期,日期格式保证为“YYYY-MM-DD hh:mm:ss ”这种形式. ...
- Active Desktop--桌面字体背景被修改
怎么修改回来 步骤如下 方法一.在桌面上点击右键 -- 排列图标 -- 去掉“在桌面上锁定Web项目”上的勾. 方法二.右键点击我的电脑 -- 属性 -- 高级 -- 点击“性能”下面的“设置”按钮, ...
- (转)基于PHP的cURL快速入门
1. 原文:基于PHP的cURL快速入门 英文原文:http://net.tutsplus.com/tutorial ... for-mastering-curl/ 原文作者:Burak Guzel ...
- Android清单文件AndroidMenifest.xml
1.AndroidMenifes.xml清单文主要结构件结构 所谓主要结构就是每一个清单文件中都必不可少的结构主要是下面三层 第一层.menifest 第二层.application,use-sdk ...