2012-08-03 48 views
0

我使用jQuery作爲UI,Struts2作爲Action,JPA用於數據訪問層。JPA LazyInitializationException?

我正面臨的問題是,當我嘗試從數據庫檢索值時,我得到LazyInitializationException。我得到下面的堆棧跟蹤:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.singpost.ctf.core.persistence.CtfTxn.ctfTxnAttribs, no session or session was closed

時默認Fetch="LAZY",代碼工作正常。但是,當我將Fetch類型更改爲EAGER時,我不知道我必須進一步做什麼。我被困在中間。

+1

[JPA LazyInitializationException中?(HTTP的可能重複:// stackoverflow.com/questions/11790289/jpa-lazyinitializationexception) – ecatmur

回答

0

如錯誤消息所示,當您嘗試訪問集合時,休眠會話已經關閉。解決方案是確保會話仍然處於打開狀態(如果您使用的是JTA,當事務提交時會話將會關閉),或者不使用延遲加載(就像您發現的那樣)。

-1

I don't know what I have to do further.

我對Zareth的答案擴大,因爲這是一個常見的問題。

一件事做的就是理解的是,當fetch=FetchType.LAZY是在ctfTxnAttribs的映射聲明,那麼JPA會加載代理對象的集合:每個對象似乎是一個ctfTxnAttrib,但只是一個代理。

這似乎可以正常工作,直到您的網頁或bean嘗試訪問該集合中的某個對象。然後你得到lazyInitializationException,因爲持久性提供者只能找到代理。如Zareth指出的那樣,您需要一個開放的持久性會話,以用ctfTxnAttrib的真實實例填充代理集合。

有實現這種不同的方式,和這裏的的話題一篇很好的文章,包括設計模式,Open Session In View

http://www.javacodegeeks.com/2012/07/four-solutions-to-lazyinitializationexc_05.html

相關問題