在系列的 SpringMVC学习系列(12) 完结篇 的示例项目中,因为当时考虑到OpenSessionInView会对性能有必定的影响,因此就没有配置项目的OpenSessionInView。在 mapping文件的配置中好比:Account.hbm.xml为了帐户登陆系统时查询方便,因此在映射Role时直接采用了 lazy="false",并且在Role映射权限Authority时也直接采用了lazy="false",这样登陆是方便了,可是在作了帐户列表时 才意识到即便没有在列表中显示帐户的角色信息仍是生成了一堆没必要要的查询语句来查询角色和权限信息,因而就把lazy="false"改成 lazy="true"(默认的即为lazy="true"),那么问题来了:web
一是在登陆查询时须要在查出来对应的帐户后,要再在代码中把帐户对应的Role和Role对应的Authority加载出来,这个还说得过去。spring
二是若是我要再作一个用户列表,好比说是给管理员用的须要显示帐户的角色信息,那么就要在对应的serivce中再写一个返回 List<Account>的方法并在方法里面循环获取的List<Account>对象并加载item的Role而后返回,这 样的话虽然和不显示角色信息的帐户列表调用的service方法返回的结果类型同样(即便查询条件也同样),仍然不能调用一样的方法。致使仅仅是界面展现 同种对象的不一样信息就要多写一堆代码(并且没有多大意义,还不便于维护),那么就把OpenSessionInView请出来吧。session
对于OpenSessionInView Spring提供了2中方式,即:OpenSessionInViewFilter和OpenSessionInViewInterceptor,因为示例项目采用的是spring mvc框架因此咱们就采用OpenSessionInViewInterceptor即拦截器的方式,其实配置很简单在springservlet-config.xml配置文件中添加,以下:mvc
<!-- 配置义过滤 -->
<mvc:interceptors>
<!-- 开启openSessionInView -->
<bean class="org.springframework.orm.hibernate4.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 自定义的权限拦截验证,若是不定义 mvc:mapping path 将拦截全部的URL请求 -->
<bean class="com.website.hpuxiaoyoulu.web.auth.AuthInterceptor"></bean>
</mvc:interceptors>app
其中<property name="sessionFactory" ref="sessionFactory" />就是在springcontext-config.xml配置文件中的事物配置,能够参考示例项目的配置文件。框架
另外这个OpenSessionInViewInterceptor的写法是针对Spring 3.X以后并在配置文件中配置了mvc:annotation-driven的写法,在这个项目中的配置就是在springservlet-config.xml中的:性能
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven validator="validator" conversion-service="conversion-service" />学习
好了,如今OpenSessionInView已经配置完成了,能够去掉lazy="false",享受OpenSessionInView方便吧。hibernate