2011-02-04 218 views
0

林下面一個Hibernate的教程中,我的數據庫中有「人」 S和「事件」休眠關係JSTL問題

之間的關係在這兩個之間的許多一對多的關係。每個人都有一組在Person.class事件,我可以用personinstance.getEvents()

繼承人什麼,我想工作訪問編程:

控制器(節選):

List<Person> persons = personManager.getPersons(); 
    Map<String, Object> myModel = new HashMap<String, Object>(); 
    myModel.put("persons", persons); 

    return new ModelAndView("WEB-INF/jsp/hello.jsp","model",myModel); 

jsp頁面:

<%@ include file="include.jsp"%> 
<html> 
<head> 
<title>Hello</title> 
</head> 
<body> 
<h1>Persons</h1> 
<br /> 
<c:forEach items="${model.persons}" var="person"> 
    <c:out value="${person.firstname }" /> 
    <c:out value="${person.lastname }" /> 

    <c:forEach items="${person.events }" var="event"> 
     <c:out value="${event.title }" /> 
    </c:forEach> 

    <br /> 
</c:forEach> 
</html> 

錯誤:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: domain.Person.events, no session or session was closed 

我不知道我是否正確地使用這個方法(使用jstl爲每個循環嵌套),或者如果我可以通過控制器或其他東西來實現結果。但我需要一些建議

回答

2

這裏有幾個類似的問題在這裏關於stackoverflow。作爲一個友好的建議,嘗試在打開一個新問題之前搜索異常的一般部分。在這種情況下,「沒有會話或會話已關閉」。

問題是您的視圖試圖訪問「事件」,當它加載Person列表時,它沒有被Hibernate加載。這被稱爲延遲加載。如果您知道在視圖中需要「事件」,則必須在分派給視圖之前預加載它。這被稱爲急切加載。例如,在您的Person模型中,您的@ManyToMany可能如下所示:

@ManyToMany(fetch = FetchType.EAGER)