過濾器filter處理no session 懶載入異常
在專案練習的時候,遇到了這個懶載入異常,當時解決的方法是在配置檔案中設定lazy=“false”。該方法有很到缺點,效率極低,我們將所有相關聯的資料都查詢了,頻繁的查詢降低了效率!!不建議採用
懶載入是什麼:
hibernate懶載入也叫延遲載入,是Hibernate3關聯關係物件預設的載入方式,所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。簡單理解為,只有在使用的時候,才會發出sql語句進行查詢。 延遲載入機制是為了避免一些無謂的效能開銷而提出來的,在Hibernate中提供了對實體物件的延遲載入以及對集合的延遲載入,另外在Hibernate3中還提供了對屬性的延遲載入。(延遲載入是hibernate的一種機制,主要是解決不必要的查詢對資源的浪費,只有當資料真正呼叫時才載入,而不會對資料進行提前載入造成資源的浪費)。
load()方法就是延遲載入,延遲載入的有效期是在session開啟的情況下,當session關閉後,會報異常。當呼叫load方法載入物件時,返回代理物件,等到真正用到物件的內容時才發出sql語句。
但是效率低。
當一個請求來了之後,先執行Action,在執行結果。在action裡面有Service業務層,呼叫Service,Service做業務處理。
開始執行Service方法的時候,開始開啟事務和Session,Service方法結束或回滾提交事務,會自動關閉Session。
在Service裡面查詢列表載入物件的時候,但是其相關連的物件並沒有載入,但是Session關閉了,關聯物件最終沒有載入,在頁面中用到了懶載入屬性,但是是在之前載入的,且Session已經關閉了,所以有了懶載入異常,說沒有Session。
連結:https://www.jianshu.com/p/1a8343292c4a
解決辦法:加OpenSessionInViewFilter過濾器,過濾的是jsp檔案,不是servlet
web.xml中
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>s69-spring-05</display-name> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <!-- 過濾的是jsp檔案,過濾servlet檔案沒有用 --!> </web-app>