我使用jquery用于UI,Struts2用作Action,JPA用于数据访问层。我面临的问题是,当我尝试从数据库中检索值时,我收到了LazyInitializationException。我得到以下stacktrace:
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 :(得分:1)
如果您尝试从实体访问延迟的fetched属性,JPA会再次尝试访问数据库以获取数据。你的问题是,此时你不在交易中。有很多方法可以扩展您的交易,例如使用openSessionInViewFilter
(Hibernate/Spring: failed to lazily initialize - no session or session was closed)
我个人更喜欢创建传输对象,每个页面对应一个要显示的对象,仅包含必要的数据。您只需要将实体映射到这些传输对象,例如使用推土机映射器,这是非常强大和方便的。 这样,管理事务就容易得多,其次你不在前端使用数据库实体,因为你的前端不需要知道你的持久层的任何信息。