錯誤記錄(八)could not initialize proxy - no Session

阿木俠發表於2017-05-31

推薦一個學習Java的小眾網站:https://www.javazhiyin.com/

在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錯誤,記錄下來,避免再錯。

 

安利一個,關注後端技術精選,號內回覆“學習資料”,領取100套小程式原始碼+小程式開發視訊和Java經典書籍電子版!

 

相關文章