2011-02-04 7 views
0

イムは2間の多対多の関係があります。それぞれの人は、私が仕事をしたいものを相続人)(personinstance.getEventsを使用してプログラム的休止関係JSTLの質問

にアクセスできることを、Person.class内のイベントのセットを持っています

コントローラ(抜粋):

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によってロードされなかった「イベント」にアクセスしようとしていることです。これは遅延ロードと呼ばれます。ビューに「イベント」が必要であることがわかっている場合は、ビューにディスパッチする前に事前にロードする必要があります。これはeager loadingと呼ばれます。たとえば、Personモデルでは、@ManyToManyは次のようになります。

@ManyToMany(fetch = FetchType.EAGER)