2010年11月5日 星期五

SSH延遲加載(Lazy Load)的問題

錯誤訊息:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session

原因:
hibernate session可由spring在控制,hibernate允許對關聯對象、屬性進行延遲加載,但是必須保證延遲加載的操作限於同一個Hibernate Session 範圍之內進行。若Session關閉後,會導致延遲加載資料的訪問異常。

解決方式:
1. hibernat設定檔中,在該table hbm.xml加入lazy=false(預設為true)
優:最快解決
缺:若相關連table很多,會一併撈回來,記憶體用量增大

2. 在Service層中Session還沒被關閉,這時將頁面所需要的欄位都存入自定的bean中,若用OpenSessioninViewFilter可將session延遲關閉,更詳細請參考
優:不用將用不到的欄位都撈回來
缺:要多寫一個bean,並且要將每個元素依依set進去,較蠻煩。(用BeanUtils可快速塞好)

更詳細的延遲加載請參考 良葛格學習筆記