在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简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...
maven+springmvc+springjpa+hibernate简单例子,有需要的朋友可以参考看看,没费的哦。
maven+springjpa+hibernate例子
springmvc+springjpa+hibernate整合简例
基础框架,可满足开发需要
Spring集成Jpa(Hibernate实现)例子,原代码哦~! 包涵所需要的jar包,这些jar包不好找,版本如果不兼容就会出现各种各样的莫名其妙的错误或异常。
本项目整合spring_jpa_hibernate_shiro,spring_jpa_hibernate_shiro.zip 里有代码,spring_jpa_hibernate常用的小弟就没有单独说明了,在项目配置文件里写得比较清楚,小弟在主要是shiro权限控制做了单独说明,如有...
Struts2+Spring+JPA(Hibernate)项目所需要的jar包
velocity spring jpa hibernate 整合
JPA和Hibernate的关系,JPA:Java Persistence APIJPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA-Hibernate包, JPA-Hibernate包, JPA-Hibernate包, JPA-Hibernate包, JPA-Hibernate包, JPA-Hibernate包
库文件 博文链接:https://log-cd.iteye.com/blog/562054
spring4.2+spring mvc +spring data+jpa+hibernate的程序构架
JSF+Spring+JPA(Hibernate实现)的环境搭建.doc JSF+Spring+JPA(Hibernate实现)的环境搭建.doc
Java Web高级编程 涵盖WebSockets、Spring Framework、JPA Hibernate和Spring Security, 有目录,很清晰
spring4.0.1 springMVC jpa2.0 hibernate4.3.7 框架整合
手把手教你从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate。 http://blog.csdn.net/anxpp中有详细搭建教程
NULL 博文链接:https://michaelzqm.iteye.com/blog/692225
这是jsf+spring2.5+jpa(hibernate)的jar包,很多人为了jsj环境而配置半天,在此提供jar包共享。注:除了ajax4jsf和tomahawk-1.1.3.jar,因为csdn只让我上传20mb,大家自己可以下一下自己试试。