SpringMVC學習系列-後記 開啓項目的OpenSessionInView

       在系列的 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

相關文章
相關標籤/搜索