2012-04-01 6 views
0

org.hibernate.LazyInitializationException abzurufen: failed lazily eine Sammlung von Rolle zu initialisieren: com.siteadmin.domain.HostSite.sectionList wurdeWie eine Liste der Unter-Entitäten

Host-Site-

keine Sitzung oder einer Sitzung geschlossen
@Entity 
@Table(name="hs") 
public class HostSite { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @OneToMany(mappedBy="hostSite") 
    private List<HostSiteSection> sectionList; 

Host-Site-Abschnitt

@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; 

-Controller

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> 

Wo fällt es auseinander? In der Steuerung oder jsp? Was ist die Ursache? Ich habe sowohl eifrig als auch faul versucht.

Antwort

0

Sie müssen die Sammlung sectionList innerhalb der HostSite eifrig laden.

@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-Dokumentation reference.

0

Das Problem besteht darin, dass Ihre Hibernation-Sitzung zu dem Zeitpunkt geschlossen wurde, als Ihr Code versucht, die Liste abzurufen. Es kann auch vorkommen, wenn Ihre Entität nicht mehr an die Sitzung gebunden ist, weil sie geschlossen und wieder geöffnet wurde.

Die Zuordnung der Liste als eifrig könnte dies beheben, aber es ist nicht die beste Lösung. Das Verwenden von "Eager" -Tasten kann zu erheblichen Leistungsproblemen beim Ruhezustand führen.

Eine bessere Lösung besteht darin, sicherzustellen, dass die Hibernation-Sitzung geöffnet ist und Ihre Entität daran angeschlossen ist, wenn Sie sie verwenden. Dies wird wahrscheinlich in Ihrer Situation am einfachsten gehandhabt, indem Sie einen Servlet-Filter für das open-session-in-view Muster anfügen. Andere mögliche Lösungsansätze für das Problem werden auch im Abschnitt über die Winterschlafdokumentation unter performance fetching initialization beschrieben.

Verwandte Themen