`
whoosh
  • 浏览: 238058 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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项目都会加入一些开源的缓存管理框架,这样一来,对效率的影响就变得很小了。

分享到:
评论
4 楼 beming 2014-10-25  
liwenjieifk 写道
为什么我这样配置就没有效果了!


BTW,我这边是可以,正常的。
3 楼 beming 2014-10-25  
liwenjieifk 写道
为什么我这样配置就没有效果了!


其实你可以搜索一下OpenEntityManagerInViewFilter not work,在stackoverflow有个提问就说到了这个,当时说的解决方案是/* 要改为/xxx/*这样子就可以了。你可以试试,如果可以了, 能否告知一下,呵呵
2 楼 liwenjieifk 2014-07-12  
为什么我这样配置就没有效果了!
1 楼 QinAIns 2014-02-21  
感谢!我遇到问题lazy的问题,困扰我两天了。终于解决了。
Spring-Data-Jpa用的是jpa实现,所以要用OpenEntityManagerInViewFilter。而“Spring针对Hibernate的非JPA实现用的是OpenSessionInViewFilter”。

相关推荐

    DWR+JPA DWR直接访问SERVICE层,并直接处理DAO返回的BEAN.doc

    为了解决这个问题,我们需要在`web.xml`中配置Spring的`OpenEntityManagerInViewFilter`。这个过滤器保持EntityManager在请求生命周期内开放,使得懒加载(lazy-loading)能在DWR调用结束后仍然有效。 配置`...

    SPRING API 2.0.CHM

    OpenEntityManagerInViewFilter OpenEntityManagerInViewInterceptor OpenPersistenceManagerInViewFilter OpenPersistenceManagerInViewInterceptor OpenSessionInViewFilter OpenSessionInViewFilter ...

    jsf+spring+hibernatre整合笔记

    - 可以使用Spring的`OpenEntityManagerInViewFilter`,以确保在JSF请求处理期间保持数据库会话的开放状态。 5. **实体类和映射文件**: - 实体类是Java对象,它们代表数据库中的表。每个实体类通常有一个与之对应...

    集成spring的hibernate懒加载

    1. **Open Session in View (OSIV)**:这是一种将Session保持开放到视图渲染完毕的设计模式,通常通过Spring的`OpenEntityManagerInViewFilter`或`OpenSessionInViewInterceptor`实现。但这可能导致长时间的数据库...

    将_Shiro_作为应用的权限基础_五:SpringMVC+Apache_Shiro+JPA(hibernate)整合配置

    - **OpenEntityManagerInViewFilter**:此过滤器使得`EntityManager`能够在视图渲染过程中保持打开状态。这是Spring针对Hibernate的非JPA实现使用的`OpenSessionInViewFilter`的JPA版本。 #### 2. ...

    Spring集成JPA配置懒加载报错解决方案

    &lt;filter-class&gt;org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter &lt;filter-name&gt;openEntity &lt;url-pattern&gt;/* ``` 报错二:no serializer 懒加载报错的第二个问题是no serializer报错。...

    通俗易懂的SSSP整合&分页教程(含配套资料)

    Spring、SpringMVC、JPA、SpringData 进行 CRUD、翻页整合示范外,还涉及到了诸多企业开发时的细节:基于Restful 风格的 URL、使用 JPA 二级缓存、使用 @ResponseBody 注解完成 Ajax、把超链接转换为 DELETE 请求、...

    springmvc +shiro+querydsl+jpa框架多数据源配置详细说明

    &lt;filter-class&gt;org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter ``` 六、DAO 实现类 EntityManager 注解修改 在所有 DAO 实现类中添加持久化单元名称,以便实现事物管理。 ``` @Repository...

    com.springsource.javax.persistence-2.0.0.jar.zip

    Spring通过其开放资源管理器(OpenEntityManagerInViewFilter)和事务管理器(PlatformTransactionManager)来支持JPA,使得在Spring应用中使用JPA变得简单而高效。 在Maven中,这个jar文件通常作为依赖项添加到...

Global site tag (gtag.js) - Google Analytics