0

我将 jQuery 用于 UI,将 Struts2 用作操作,将 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,我不知道我还需要做什么。我被困在中间。

4

2 回答 2

0

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

于 2012-08-03T10:36:05.523 回答
-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

于 2015-12-18T21:35:06.207 回答