1. 程式人生 > >SpringMVC學習系列-後記 開啟專案的OpenSessionInView

SpringMVC學習系列-後記 開啟專案的OpenSessionInView

在系列的 SpringMVC學習系列(12) 完結篇 的示例專案中,由於當時考慮到OpenSessionInView會對效能有一定的影響,所以就沒有配置專案的OpenSessionInView。在mapping檔案的配置中比如:Account.hbm.xml為了賬戶登入系統時查詢方便,所以在對映Role時直接採用了lazy="false",而且在Role對映許可權Authority時也直接採用了lazy="false",這樣登入是方便了,但是在做了賬戶列表時才意識到即使沒有在列表中顯示賬戶的角色資訊還是生成了一堆不必要的查詢語句來查詢角色和許可權資訊,於是就把lazy="false"改為lazy="true"(預設的即為lazy="true"),那麼問題來了:

一是在登入查詢時需要在查出來對應的賬戶後,要再在程式碼中把賬戶對應的Role和Role對應的Authority加載出來,這個還說得過去。

二是如果我要再做一個使用者列表,比如說是給管理員用的需要顯示賬戶的角色資訊,那麼就要在對應的serivce中再寫一個返回List<Account>的方法並在方法裡面迴圈獲取的List<Account>物件並載入item的Role然後返回,這樣的話雖然和不顯示角色資訊的賬戶列表呼叫的service方法返回的結果型別一樣(即使查詢條件也一樣),仍然不能呼叫同樣的方法。導致僅僅是介面展示同種物件的不同資訊就要多寫一堆程式碼(而且沒有多大意義,還不便於維護),那麼就把OpenSessionInView請出來吧。

對於OpenSessionInView Spring提供了2中方式,即:OpenSessionInViewFilter和OpenSessionInViewInterceptor,由於示例專案採用的是spring mvc框架所以我們就採用OpenSessionInViewInterceptor即攔截器的方式,其實配置很簡單在springservlet-config.xml配置檔案中新增,如下:

<!-- 配置義過濾 -->
    <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>

其中<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方便吧。