hibernate學習筆記-關閉session以後如何進行懶加載《二》

當在使用Hibernate作開發的時候出現org.hibernate.LazyInitializationException: could not initialize proxy - no Sessionweb

錯誤提示session

病症:這是一個lazy使用後的Exception,使用遲時加載,在session(hibernate裏的session)關閉後使用該對象的未加載變量,也就是說session已經關閉,沒有保存到內存中,而後你使用了,致使該異常。
解決方法:spa

方法1:hibernate

<may-to-one>or<one-to-may>的lazy屬性默認爲:lazy = "proxy"
解決:<many-to-one>   & <set> 中設置 lazy="false"線程

若是還不行,根據本身需求,通過個人仔細排查放在set一端不行,那就放在<many-to-one>那端orm

 

總結:緣由是hibernate的session已經關閉,集合沒有被初始化。在hibernate中:hibernate3 默認支持延遲加載(lazy="proxy"咱們能夠把proxy看做是true),hibernate2 默認當即加載 (lazy="false")。xml

      在hibernate3中,全部的實體設置文件(user.hbm.xml)中的lazy屬性都被默認設成了true,就是當這個類沒有被調用時,延時加載,致使了以上狀況的發生,在配置文件中將lzay屬性設爲false就能夠了。對象

 

可是這種方法非常消耗資源事務


方法2:用openSessionInView內存

 

Spring爲咱們解決最讓人頭痛的難題之一,Hibernate的Session的關閉與開啓問題。 
Hibernate 容許對關聯對象、屬性進行延遲加載,可是必須保證延遲加載的操做限於同一個 Hibernate Session 範圍以內進行。若是 Service 層返回一個啓用了延遲加載功能的領域對象給 Web 層,當 Web 層訪問到那些須要延遲加載的數據時,因爲加載領域對象的 Hibernate Session 已經關閉,這些致使延遲加載數據的訪問異常。而Spring爲咱們提供的OpenSessionInViewFilter過濾器爲咱們很好的解決了這個問題。OpenSessionInViewFilter的主要功能是使每一個請求過程綁定一個 Hibernate Session,即便最初的事務已經完成了,也能夠在 Web 層進行延遲加載的操做。OpenSessionInViewFilter 過濾器將 Hibernate Session 綁定到請求線程中,它將自動被 Spring 的事務管理器探測到。因此 OpenSessionInViewFilter 適用於 Service 層使用HibernateTransactionManager 或 JtaTransactionManager 進行事務管理的環境,也能夠用於非事務只讀的數據操做中。

所謂的OpenSessionInView模式,把session的週期交給servlet filter來管理,每當有request進來,就打開一個sessionresponse結束以後再關閉它,這樣可讓session存在於整個請求週期中

相關文章
相關標籤/搜索