對於hibernate懶載入模式報錯處理
阿新 • • 發佈:2019-01-02
在開發專案的過程中碰到了一些和hibernate懶載入有關的錯誤,記錄一下。
在實際開發中,我們常常會將兩個表關聯起來(設定外來鍵),這在hibernate對映為物件時會變成兩個物件關聯(即一個物件有另一個物件的引用),這本來是一個非常好用的機制,但是因為hibernate的懶載入模式,導致我們開發過程中會遇到各種坑。
什麼是懶載入模式:就是hibernate在查詢資料庫的時候會將非引用變數(沒有外來鍵的)正常查詢出來,但是對於引用變數(外來鍵),hibernate不會全部查詢出來,而是放了個代理物件,在你要用到它的時候才去查詢,減少開銷。但是,問題就在這,我們每次查詢結束都會把session給關了,然後在以後用到引用的物件時,hibernate發現session已經被關閉,就報了個錯 session沒找到的錯誤。
1.在jsp頁面使用ognl或者el表示式取關聯物件時報錯
可以配置一個hibernate的過濾器,告訴hibernate什麼時候request結束,將session的關閉延時到request請求結束。
<!-- 把session的關閉延遲到jsp頁面顯示之後,解決hibernate懶載入無問題,在配在struts2上面。-->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class >
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class >
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.ajax請求時,使用外掛對物件進行序列化出錯
這個問題發生的原因也是和上面的差不多,不過區別的是上面的配置無法解決這個問題,具體原因我也不知道,但是,我有一個比較笨的解決辦法:可以給不需要的資料的getter方法設定註解@JSON(serialize = false),這樣就不會將該屬性序列化。對必須要用的資料又是引用變數的關閉懶載入模式@ManyToOne(fetch = FetchType.EAGER)