在系列的 SpringMVC學習系列(12) 完結篇 的示例項目中,由于當時考慮到OpenSessionInView會對性能有一定的影響,所以就沒有配置項目的OpenSessionInView。在mapping文件的配置中比如:Account.hbm.xml為了賬戶登錄系統(tǒng)時查詢方便,所以在映射Role時直接采用了lazy="false",而且在Role映射權限Authority時也直接采用了lazy="false",這樣登錄是方便了,但是在做了賬戶列表時才意識到即使沒有在列表中顯示賬戶的角色信息還是生成了一堆不必要的查詢語句來查詢角色和權限信息,于是就把lazy="false"改為lazy="true"(默認的即為lazy="true"),那么問題來了: 一是在登錄查詢時需要在查出來對應的賬戶后,要再在代碼中把賬戶對應的Role和Role對應的Authority加載出來,這個還說得過去。 二是如果我要再做一個用戶列表,比如說是給管理員用的需要顯示賬戶的角色信息,那么就要在對應的serivce中再寫一個返回List<Account>的方法并在方法里面循環(huán)獲取的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" /> 好了,現(xiàn)在OpenSessionInView已經(jīng)配置完成了,可以去掉lazy="false",享受OpenSessionInView方便吧。 |
|
來自: 小米錢 > 《SpringMVC》