Spring的OpenEntityManagerInViewFilter
来源:互联网 发布:淘宝外围活动怎么参加 编辑:程序博客网 时间:2024/05/17 01:07
原址:点击打开链接
Spring的OpenEntityManagerInViewFilter
- 博客分类:
- Spring
在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
- Spring的OpenEntityManagerInViewFilter
- Spring的OpenEntityManagerInViewFilter
- Spring的OpenEntityManagerInViewFilter
- Spring的OpenEntityManagerInViewFilter
- Spring data jpa的OpenEntityManagerInViewFilter
- spring data jap的openEntityManagerInViewFilter和hibernate的openSessionInViewFilter
- OpenEntityManagerInViewFilter
- ssh OpenEntityManagerInViewFilter 的一些总结
- web.xml中openEntityManagerInViewFilter的作用
- web.xml中openEntityManagerInViewFilter的作用
- web.xml中openEntityManagerInViewFilter的作用
- web.xml中openEntityManagerInViewFilter的作用
- web.xml中openEntityManagerInViewFilter的作用
- web.xml中openEntityManagerInViewFilter的作用
- web.xml中openEntityManagerInViewFilter的作用
- web.xml中openEntityManagerInViewFilter的作用
- spring data jpa 中的OpenEntityManagerInViewFilter 取代OpenSessionInViewFilter 放置session失效
- 计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接
- 广告轮播图
- 常规波束形成的CPU和GPU的运行时间对比测试
- 详细解析:影响各类服务器性能瓶颈的因素
- Pop Sequence
- Spring的OpenEntityManagerInViewFilter
- OpenCV学习笔记(八)—— OpenCV 3.1.0 + opencv_contrib编译(Windows)
- iOS 在视图控制器里面判断 应用程序的前台
- CodeForces 660C Hard Process (队列)
- java基础——反射
- opencv摄像头视频+帧保存为图片
- 20160422-Eclipse注释设置
- Unity对象池(一)
- jdbc数据源配置