web.xml中openEntityManagerInViewFilter的作用

原创 2012年03月22日 10:14:44
<!-- Open Entity Manager in View filter-->
	<filter>
		<filter-name>openEntityManagerInViewFilter</filter-name>
		<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openEntityManagerInViewFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

在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层结束后才关闭。

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




版权声明:本文为博主原创文章,未经博主允许不得转载。

spring data jpa 中的OpenEntityManagerInViewFilter 取代OpenSessionInViewFilter 放置session失效

spring 中 正常的防止session失效的方法是: hibernateFilter org.springframework.orm.hibernate4.support.Open...
  • a137268431
  • a137268431
  • 2014年01月22日 10:20
  • 4696

OpenEntityManagerInViewFilter

OpenEntityManagerInView和Hibernate的OpenSessionInView一样,服务端在接收到一个请求的时候开启EntityManager,在请求结束的时候才去关闭这个En...
  • sarck3
  • sarck3
  • 2013年08月04日 21:02
  • 668

spring data jap的openEntityManagerInViewFilter和hibernate的openSessionInViewFilter

could not initialize proxy - no Session之前项目使用hibernate来管理dao,将session的管理交给spring,即添加OpenSessionInVie...
  • fo11ower
  • fo11ower
  • 2016年02月27日 15:21
  • 883

Java Web中web.xml文件的作用

web.xml文件是用来初始化工程配置信息的,比如说welcome页面,filter,listener,servlet,servlet-mapping,启动加载级别等等,当你的web工程中没用到这些当...
  • u013770825
  • u013770825
  • 2014年02月25日 21:24
  • 1998

关于SpringOpenSessionInViewFilter的配置及处理方案

spring 4的SpringOpenSessionInViewFilter的配置及处理方案
  • wanggangabc111
  • wanggangabc111
  • 2016年08月12日 15:23
  • 574

web.xml里的标签是起什么作用的

一个web中完全可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。 那什么时候需要,什么时候可以不需要呢? 要想回答上面的问题,得先了解web.xml文件使用来干什么的...
  • ywl570717586
  • ywl570717586
  • 2015年10月29日 17:39
  • 2537

web.xml文件的作用----接上面的那个,看的多了,也就知道的差不多了

除了。下面的第9,10条,没用,其他的都在项目里有用到。。。。。。。。 先看各个配置都是干嘛的: 1、Web应用图标:指出IDE和GUI工具用来表示Web应用的大图标和小图标          /im...
  • qq_27093465
  • qq_27093465
  • 2016年06月24日 16:37
  • 838

xml在Web中的作用

xml在web中的作用,及其一些讲解
  • jinhuoxingkong
  • jinhuoxingkong
  • 2016年06月08日 11:01
  • 1301

web.xml中listener作用及使用

一.WebContextLoaderListener 监听类 它能捕捉到服务器的启动和停止,在启动和停止触发里面的方法做相应的操作! 它必须在web.xml 中配置才能使用,是配置监听类的 ...
  • yy954744913
  • yy954744913
  • 2017年02月24日 17:49
  • 289

关于在SSH项目中使用OpenSessionInViewFilter过滤器后数据库数据不更新的问题

楼主这里使用的是MySQL数据库,
  • a88032303a
  • a88032303a
  • 2014年08月04日 19:30
  • 506
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:web.xml中openEntityManagerInViewFilter的作用
举报原因:
原因补充:

(最多只允许输入30个字)