`
ljz0721cx
  • 浏览: 12222 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring Jpa和hibernate的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>

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

相关推荐

    SpringMVC+Spring+SpringDataJPA+Hibernate整合登录的效果

    这是整合SpringMVC+Spring+SpringDataJPA+Hibernate简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...

    maven+springmvc+springjpa+hibernate

    在IT行业中,构建高效、可维护的Web应用是至关重要的,而"Maven+SpringMVC+SpringJPA+Hibernate"的组合就是一个常见的解决方案。这个组合提供了全面的开发工具和技术,帮助开发者快速构建基于Java的Web应用程序。...

    maven+springjpa+hibernate

    在现代Java开发中,Maven、Spring Data JPA和Hibernate是三个非常重要的工具和技术。Maven是项目管理工具,Spring Data JPA提供了对数据库操作的高级抽象,而Hibernate则是Java持久化层的一个流行实现。将它们整合在...

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...

    Spring + JPA + Hibernate配置

    - `cglib-2.1.3.jar` 是一个代码生成库,Spring和Hibernate都可能利用它创建代理类。 在实际项目中,集成Spring、JPA和Hibernate时,开发者需要配置Spring的XML或Java配置文件,声明数据源、事务管理器以及JPA的...

    spring-jpa(hibernate实现)环境搭建

    标题 "spring-jpa(hibernate实现)环境搭建" 涉及到的是在Java开发中使用Spring Data JPA和Hibernate来构建数据访问层的过程。Spring Data JPA是Spring框架的一部分,它提供了一种简化的方式来操作数据库,而...

    spring mvc 与JPA/Hibernate的整合示例

    在Java Web开发中,Spring MVC和JPA(Java Persistence API)以及Hibernate作为ORM(对象关系映射)框架的实现,是构建高效、可维护性的应用的常见选择。本示例将探讨如何将这三个组件整合在一起,以实现一个完整的...

    springmvc+springjpa+hibernate整合简例

    接着,SpringJPA是Spring对JSR-338标准的实现,它允许开发者通过简单的API与各种JPA提供商(如Hibernate)进行交互。引入SpringJPA后,我们不再需要直接编写SQL,而是可以使用注解来定义实体类和数据访问接口。例如...

    Spring集成Jpa(Hibernate实现)

    这个例子展示了如何在Spring应用中配置和使用JPA,以便利用Hibernate作为JPA的提供者。让我们深入探讨这个集成过程中的关键知识点。 1. **JPA简介**:JPA是Java平台上的一个标准,它为对象持久化到关系数据库提供了...

    JPA和Hibernate的关系

    随着JPA标准的推广和被广泛采用,越来越多的厂商和框架开始支持JPA,其中包括Spring Framework、OpenJPA、EclipseLink(原TopLink)等。这种广泛的采纳使得JPA成为了一个重要的行业标准,为开发者提供了丰富的资源和...

    Spring+SpringMVC+SpringDataJPA+Hibernate

    接着,配置Spring Data JPA和Hibernate,包括数据源、实体管理工厂、事务管理器等。最后,定义Repository接口,Spring Data JPA会自动实现这些接口,提供数据库操作方法。 在实际开发中,Spring Data JPA的...

    spring_jpa_hibernate_shiro整合(maven)

    本项目整合spring_jpa_hibernate_shiro,spring_jpa_hibernate_shiro.zip 里有代码,spring_jpa_hibernate常用的小弟就没有单独说明了,在项目配置文件里写得比较清楚,小弟在主要是shiro权限控制做了单独说明,如有...

    Struts2+Spring+JPA(Hibernate)的jar包

    Struts2、Spring和JPA(Hibernate)是Java Web开发中的三大核心框架,它们共同构建了一个强大、灵活且可扩展的后端系统。这个压缩包包含的jar文件是这三个框架协同工作所需的基础库。 首先,Struts2是一个基于MVC...

    velocity spring jpa hibernate 整合

    在这个项目中,"velocity spring jpa hibernate 整合"涉及到的是四个关键组件:Velocity、Spring、JPA(Java Persistence API)和Hibernate。让我们逐一深入理解这些技术并探讨它们如何协同工作。 1. **Velocity**...

    Struts+Spring+Jpa(hibernate)整合

    Struts、Spring 和 Hibernate 是Java Web开发中的三大框架,它们分别负责不同的职责:Struts用于控制应用程序的流程,Spring提供全面的依赖注入和事务管理,而Hibernate则专注于对象关系映射(ORM),使得数据库操作...

    基于jpa+hibernate+spring+spring mvc注解方式项目

    这个项目案例对于初学者来说,是一个很好的实践平台,可以帮助理解Spring、Spring MVC、JPA和Hibernate之间的协作,以及如何在实际项目中应用这些技术。通过实际操作,可以加深对这些框架的理解,提升开发技能。

    spring4.2+spring mvc +spring data+jpa+hibernate的程序构架

    在本项目中,我们看到的是一个基于 Spring 4.2 版本的综合构架,结合了 Spring MVC、Spring Data 和 JPA,以及 Hibernate 的使用。这些技术的整合为构建高效、可维护的 web 应用提供了强大的支持。 1. **Spring 4.2...

    spring+springMVC+jpa+hibernate框架整合

    在IT领域,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+jpa+hibernate框架整合"就是一个常见的解决方案。这个整合涉及到四个关键的技术栈:Spring框架、SpringMVC、JPA(Java Persistence API)...

Global site tag (gtag.js) - Google Analytics