錯誤記錄(八)could not initialize proxy
在SSH整合專案中出現瞭如下錯誤資訊:
org.hibernate.LazyInitializationException:could not initialize proxy - no Session
org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:149)
org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:195)
org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
could not initialize proxy - no Session——翻譯為無法初始化沒有會話的代理物件
出現該錯誤的原因是Hibernate使用sessionFactory來管理session,我們每進行一次資料庫操作時都會新建一個session物件,當我們操作完成後,hibernate就會在dao層立即關閉該session。所以當我們操作類中另一個類的具體屬性時,因為session已經關閉,就會報錯。
這是Hibernate的懶載入策略,因為每一次查詢我們並不會使用到查詢物件關聯的所有物件,所有Hibernate在查詢資料庫時並不會把類關聯的物件統一查出來。
既然知道了錯誤的原因,就很好解決了。
第一種辦法:
最直接的辦法就是把Hibernate的懶載入機制關閉,方法:
在對映檔案中多對一對映處寫 : azy="false"
但是這種辦法不推薦,取消懶載入之後每次查詢用不用得到的物件都要加載出來,很影響效率。
第二種辦法:
不要Hibernate去管理session,而是將session交給servlet filter來管理,每當接收一個請求後就會開啟一個session,只有當響應結束後才會關閉。
具體做法:
在web.xml中配置:
<filter-name>hibernateFilter</filter-name> <filter-class> org.springframework.orm.hibernate4.support.OpenSessionInViewFilter </filter-class> </filter <filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
這樣就解決了could not initialize proxy - no Session錯誤,記錄下來,避免再錯。