星空网 > 软件开发 > Java

web.xml中openEntityManagerInViewFilter的作用(转)


 <span style="font-size:18px;"><!-- Open Entity Manager in View filter-->  


  1.     <filter>  
  2.         <filter-name>openEntityManagerInViewFilter</filter-name>  
  3.         <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>  
  4.     </filter>  
  5.     <filter-mapping>  
  6.         <filter-name>openEntityManagerInViewFilter</filter-name>  
  7.         <url-pattern>/*</url-pattern>  
  8.     </filter-mapping></span>  

 

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

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

 

 
  1. Service{    
  2.         entitymanager=context.getEntityManager();    
  3.         if(entitymanager==null) context.put(factory,createEntityManager());    
  4.         entitymangager=context.getEntityManager();    
  5.         entitymanager.begin();    
  6.         public void find(Integer productid){//除了这个方法外,其他都是通过AOP织入的    
  7.             em.getReference(Product.class,productid));    
  8.         }    
  9.         entitymanager=context.getEntityManager();    
  10.         entitymanager.commit();    
  11.         entitymanager.close();    
  12. }    

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

 

OpenEntityManagerInViewFilter会让session一直到view层调用结束后才关闭,请看下面的伪代码:

[html] view plain copy 


  1. Filter{    
  2.         doFilter(chain){    
  3.             context.getEntityManager().open();    
  4.             chain.doFilter(req,res){    
  5.                 xxxAction{    
  6.                     execute(){    
  7.                         Product product=service.find(productid);//此时该对象为游离状态,实际上并没有在数据库获得值。    
  8.                         req.setAttibute("Product",produxt);//这时候才到数据库里面去取值    
  9.                         return mapping.findForward("product");    
  10.                     }    
  11.                 }    
  12.             }    
  13.             context.getEntityManager().close()...    
  14.         }    
  15.     }    


如果没使用OpenEntityManagerInViewFilter,session会在service.find()方法后就被关闭,用了以后session在整个view层结束后才关闭。

摘自:http://whoosh.iteye.com/blog/1300721




原标题:web.xml中openEntityManagerInViewFilter的作用(转)

关键词:xml

xml
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

供应链中断:https://www.goluckyvip.com/tag/3143.html
粉丝增长专家:https://www.goluckyvip.com/tag/31430.html
丰卖网:https://www.goluckyvip.com/tag/31431.html
丰卖网开店:https://www.goluckyvip.com/tag/31432.html
丰米跨境电商:https://www.goluckyvip.com/tag/31433.html
丰趣海淘:https://www.goluckyvip.com/tag/31435.html
响沙湾门票套票价格大介绍(省钱攻略必备):https://www.vstour.cn/a/404238.html
上海到镇江茅山旅游攻略 上海到镇江茅山旅游攻略路线:https://www.vstour.cn/a/404239.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流