Java JPA LazyInitializationException?

Java JPA LazyInitializationException?,java,hibernate,jpa,lazy-initialization,Java,Hibernate,Jpa,Lazy Initialization,我使用jQuery作为UI,Struts2作为Action,JPA作为数据访问层 我所面临的问题是,当我试图从数据库检索值时,我得到了LazyInitializationException。我得到了下面的跟踪: org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.singpost.ctf.core.persistence.CtfTxn.ctfTxnAttribs,未关闭任何会话或会话 当默认情况下Fetch=“LAZY”时,代码工作

我使用jQuery作为UI,Struts2作为Action,JPA作为数据访问层

我所面临的问题是,当我试图从数据库检索值时,我得到了
LazyInitializationException
。我得到了下面的跟踪:

org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.singpost.ctf.core.persistence.CtfTxn.ctfTxnAttribs,未关闭任何会话或会话


当默认情况下
Fetch=“LAZY”
时,代码工作正常。但是当我将
Fetch
类型更改为
EAGER
时,我不知道我还需要做什么。我被卡在中间。

当错误消息声明时,当您尝试访问集合时,休眠会话已经关闭。解决方案是确保会话仍然打开(如果您使用的是JTA,则在事务提交时会话将关闭),或者不使用延迟加载(如您所发现的)。

我不知道我还需要做什么。

我对Zareth的答案进行了扩展,因为这是一个常见的问题

要做的一件事是了解,当在
ctfTxnAttrib
的映射上声明
fetch=FetchType.LAZY
时,JPA将加载一个代理对象集合:每个对象看起来都是
ctfTxnAttrib
,但只是一个代理

在您的网页或bean尝试访问该集合中的对象之前,这一切似乎都可以正常工作。然后您会得到
lazyInitializationException
,因为持久性提供程序只找到代理

正如Zareth所指出的,您需要一个开放的持久性会话,用
ctfTxnAttrib
的真实实例填充代理集合

有多种方法可以实现这一点,这里有一篇关于这个主题的非常好的文章,包括设计模式,
视图中的opensession

可能存在的副本