如何检索子实体列表

时间:2012-04-01 02:28:47

标签: spring hibernate jpa

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?原因是什么?我既热切又懒惰。

2 个答案:

答案 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文档部分中进行了描述。