1. 程式人生 > >對於hibernate懶載入模式報錯處理

對於hibernate懶載入模式報錯處理

在開發專案的過程中碰到了一些和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)