org.hibernate.LazyInitializationException:懒得初始化角色集合:com.siteadmin.domain.HostSite.sectionList,没有关闭会话或会话
主机网站
@Entity
@Table(name="hs")
public class HostSite {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToMany(mappedBy="hostSite")
private List<HostSiteSection> sectionList;
主机网站部分
@Entity
@Table(name="hsst")
public class HostSiteSection {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="hsid")
private HostSite hostSite;
控制器
screenObject.setSectionList(hostSite.getSectionList());
JSP
<c:if test="${screenObject!=null && screenObject.getSectionList()!=null}">
<c:forEach items="${screenObject.getSectionList()}" var="section">
<tr>
<td><a href="../hostSiteSection/${section.id}" target="_blank">${section.id}</a></td>
<td><a href="../hostSiteSection/${section.id}" target="_blank">${section.name}</a></td>
<td>${section.order}</td>
</tr>
</c:forEach>
</c:if>
哪里分崩离析?在控制器或jsp?原因是什么?我既热切又懒惰。
答案 0 :(得分:0)
您需要急切加载sectionList
内的集合HostSite
。
@Entity
@Table(name="hs")
public class HostSite {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToMany(mappedBy="hostSite",fetch=FetchType.EAGER)
private List<HostSiteSection> sectionList;
HQL API文档reference。
答案 1 :(得分:0)
问题是您的代码尝试检索列表时您的hibernate会话已关闭。如果您的实体不再附加到会话,因为它已关闭并重新打开,也会发生这种情况。
只是将列表映射为渴望可能会解决此问题,但这不是最佳解决方案。大量使用急切获取会导致hibernate出现重大性能问题。
更好的解决方案是确保hibernate会话处于打开状态,并在您使用它时将实体附加到它。通过为open-session-in-view模式附加servlet过滤器,这可能在您的情况下最容易处理。处理该问题的其他可能方法也在performance fetching initialization的hibernate文档部分中进行了描述。