JPA LazyInitializationException?

时间:2012-08-03 10:18:47

标签: java hibernate jpa lazy-initialization

我正在使用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时,我不知道我还需要做些什么。我被困在中间。

2 个答案:

答案 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