天天看點

org.hibernate.LazyInitializationException: could not initialize proxy - no

錯誤頁面提示

could not initialize proxy - no Session

控制台

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

病症:這是一個lazy使用後的Exception,使用遲時加載,在session(hibernate裡的session),關閉後使用該對象的未加載變量,也就是說session已經關閉,沒有儲存到記憶體中,然後你使用了,導緻該異常。

Q:我以get得到一個對象,在JSP頁面以EL表達它的執行個體變量時,也抛出了該異常,在application的測試時卻沒有出現。

A:推測可能是該執行個體變量是hibernate進行加載的,可能hibernate本身是以load的方式将該執行個體變量得到。

解決方法:

方法1 .用openSessionInView 

方法2. 把這個類的延遲加載禁掉

list=query.list();for (Object object : list) 

     Hibernate.initialize(((Deliver)object).getPlnbill());//Deliver是複合對象,有屬性引用于PlnBill

OR        

resultExchangeRatePojo.getDollarRmb();//在它的執行個體變量DollarRmb的session未關閉前存入,實際上将它載入記憶體。(我就想在沒用關閉session之前用一下就可以把值儲存到記憶體中了)

結果:果然頁面上就正常顯示了。

總結:原因是hibernate的session已經關閉,集合沒有被初始化。在hibernate中:hibernate3 預設支援延遲加載(lazy="proxy"我們可以把proxy看作是true),hibernate2 預設立即加載 (lazy="false")。

      在hibernate3中,所有的實體設定檔案(user.hbm.xml)中的lazy屬性都被預設設成了true,就是當這個類沒有被調用時,延時加載,導緻了以上情況的發生,在配置檔案中将lzay屬性設為false就可以了。

----------------------------------------------------------------

原因 :

<may-to-one>or<one-to-may> 的 lazy 屬性預設為 :lazy = "proxy"

解決 :<many-to-one>   & <set> 中設定 lazy="false" 

如果還不行,根據自己需求,經過我的仔細排查放在set一端不行,那就放在<many-to-one>那端..