[英]JPA LazyInitializationException?
我將jQuery用於UI,將Struts2用於Action,將JPA用於數據訪問層。
我面臨的問題是,當我嘗試從數據庫中檢索值時,我遇到了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
,我不知道該做什么。 我被困在中間。
如錯誤消息所述,當您嘗試訪問集合時,休眠會話已經關閉。 解決方案是確保會話仍處於打開狀態(如果您使用的是JTA,則在事務提交時會話將關閉),或者不使用延遲加載(如您所知)。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.