„Eine Sammlung der Rolle konnte nicht verzögert initialisiert werden: mvc3.model.Topic.comments, keine Sitzung oder Sitzung wurde geschlossen“ Hibernate-Ausnahme: Eine umfassende Anleitung
Diese Ausnahme, die häufig in Hibernate-Umgebungen auftritt, weist auf ein Problem beim Zugriff auf nicht initialisierte Daten hin. Um diesen Fehler zu beheben, ist es entscheidend, die Ursache zu verstehen und die richtige Lösung zu finden.
Das Problem verstehen:
Im Ruhezustand verwendet der Datenabruf eine Kombination aus sofortigem Laden (Eage Abrufen) und verzögertes Laden (Lazy Fetching). Standardmäßig werden Sammlungen und Zuordnungen verzögert abgerufen, was bedeutet, dass sie nur dann aus der Datenbank geladen werden, wenn sie ausdrücklich angefordert werden.
Im gegebenen Szenario enthält die Topic-Entitätsklasse eine Sammlung von Kommentaren (Kommentarfeld). Beim Zugriff auf diese Sammlung außerhalb einer Sitzung oder nachdem die Sitzung geschlossen wurde, löst Hibernate die Ausnahme „Fehler beim verzögerten Initialisieren einer Rollensammlung“ aus.
Untersuchung des Codes:
Der bereitgestellte Code umfasst die Topic-Entitätsklasse, den Controller (TopicController) und die JSP-Ansicht (details.jsp). Die TopicController-Methode (Details) ruft ein Thema (Topic-Instanz) anhand seiner ID ab und ruft die Kommentarsammlung ab (topicById.getComments()). Diese Sammlung wird dann an die JSP-Ansicht übergeben.
Analyse der JSP-Ansicht:
Die JSP-Ansicht verwendet eine JSTL c:forEach-Schleife, um die Kommentarsammlung zu durchlaufen. Diese Zeile verweist auf die Elemente als Element:
<c:forEach items="${commentList}" var="item">
Ursache der Ausnahme:
Die Ausnahme tritt auf, weil die Kommentarsammlung noch nicht initialisiert wurde. Da sich die JSP-Ansicht außerhalb der Hibernate-Sitzung befindet, führt der Versuch, auf die Sammlung zuzugreifen, zu dem Fehler „Fehler beim verzögerten Initialisieren einer Rollensammlung“.
Lösung: Eager Fetching
Um diese Ausnahme zu beheben, kann Eager Fetching eingesetzt werden. Dazu gehört das Laden der Kommentarsammlung zusammen mit dem Thema, wenn das Thema aus der Datenbank abgerufen wird. Ändern Sie in der Entitätsklasse Topic das Kommentarfeld wie folgt:
@OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL) private Collection<Comment> comments = new LinkedHashSet<Comment>();
Auf diese Weise ruft Hibernate die Kommentarsammlung sofort ab, wenn das Thema geladen wird. Dadurch entfällt die Notwendigkeit einer verzögerten Initialisierung und die Ausnahme wird behoben.
Alternativen zum Eager Fetching:
In bestimmten Fällen ist Eager Fetching möglicherweise nicht die bevorzugte Lösung kann zu Leistungseinbußen führen, da mehr Daten als nötig geladen werden. Zu den Alternativen gehören:
Lazy Loading verstehen und Auswirkungen:
Lazy Loading ist eine Funktion zur Verbesserung der Leistung, indem Daten nur dann geladen werden, wenn sie benötigt werden. Für die Initialisierung muss jedoch eine Sitzung geöffnet sein. Wenn die Sitzung geschlossen oder nicht geöffnet ist, führt der Zugriff auf nicht initialisierte Sammlungen zur Ausnahme „Fehler beim verzögerten Initialisieren einer Sammlung“.
Das obige ist der detaillierte Inhalt vonWie löst man die Hibernate-Ausnahme „Eine Rollensammlung konnte nicht verzögert initialisiert werden'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!