我正在使用jQuery for 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
时,我不知道我还需要做些什么。我被困在中间。
答案 0 :(得分:0)
正如错误消息所述,当您尝试访问集合时,hibernate会话已经关闭。解决方案是确保会话仍处于打开状态(如果您正在使用JTA,会话将在事务提交时关闭),或者不使用延迟加载(如您所发现的那样)。
答案 1 :(得分:-1)
I don't know what I have to do further.
我扩展了Zareth的答案,因为这是一个常见的问题。
要做的一件事是理解,当fetch=FetchType.LAZY
的映射上声明ctfTxnAttribs
时,JPA将加载代理对象的集合:每个对象看起来都是{{1} },但只是代理。
这可能看起来一切正常,直到您的网页或bean尝试访问该集合中的对象。然后得到ctfTxnAttrib
,因为持久性提供程序只找到代理。
正如Zareth指出的那样,您需要一个开放的持久性会话,用lazyInitializationException
的真实实例填充代理集合。
有多种方法可以实现这一点,这里有一篇关于该主题的非常好的文章,包括设计模式ctfTxnAttrib
:
http://www.javacodegeeks.com/2012/07/four-solutions-to-lazyinitializationexc_05.html