錯誤頁面提示
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.把這個類的延遲加載禁掉
我自己的代碼就多了這么一句話:
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>那端