faul Initialisierung Problem Ruhezustand: LazyInitializationException: failed zu träge eine Sammlung von Rolle initialisieren
-
13-09-2019 - |
Frage
Ich mag eine Transaktion in meiner Persistenz-Schicht verwalten, Aber wenn ich versuche, um die Ergebnisse zu holen lazily ich diesen Fehler:
org.hibernate.LazyInitializationException: failed zu träge eine Sammlung von Rolle initialisieren
Kann ich LOCKMODE oder irgendeine andere Art und Weise, dieses Problem zu lösen? Kann ein ein Objekt durch seine ID ohne Transaktion finden?
Lösung
Ihr Problem ist, dass die Hibernate-Sitzung bereits geschlossen ist, wenn Sie versuchen, den Inhalt zuzugreifen. Hibernate kann ohne Sitzung den Inhalt nicht geladen werden. Es gibt in der Regel zwei Möglichkeiten, dieses Problem zu mildern:
-
Sie die Sitzung nicht schließen, bis Sie mit der Seite fertig sind. Dieses Muster wird „Session in Sicht“ bezeichnet und kann beispielsweise mit einem Servlet-Filter implementiert wird.
-
Alle Inhalte initialisieren, die Sie vor dem Schließen der Sitzung benötigen. Wenn Sie das ganze Objekt initialisieren Sie Hibernate.initialize (Objekt).
verwenden können,
bearbeiten. Sie können nichts außerhalb einer Transaktion in Hibernate tun
Andere Tipps
Sie können auch auf der offiziellen Lösung von Hibernate buchen http://www.hibernate.org/43.html
Typischerweise ist das Problem ist, dass eines der Attribute des Objekts wird lazily geladen. Eine Sache, die Sie tun können, ist es in Ihrer Anfrage vorinstalliert haben:
von Sale Verkauf wo sale.date>: startdate links sale.product beitreten holen
Dies wird die sale.product Objekt-Prefetch.
Diese Website weitere Informationen hat: http://www.javalobby.org/ Artikel / hibernate-Abfrage-101 / .
-Dave
Es gibt viele Möglichkeiten zu Immobilien-Prefetch, so dass sie dort nach Sitzung geschlossen wird:
- Just entsprechende Getter nennen. Nach Feld geholt in Bohne ist, ist es dort nach Sitzung geschlossen wird.
- Verwenden Sie geeignete Attribut in Bean Descriptor in JPA Sie
@OneToMany(fetch = FetchType.EAGER)
verwenden würde, aber es gibt ähnliche Hibernate Möglichkeiten, es zu tun. - Sie können Feld in HQL Abfrage initialisiert werden (ich bin nicht sicher, ob es in HQL funktioniert, aber ich denke, es ist), suchen Sie nach
FETCH INTO
Stichwort.
Oder benutzen Sie einfach eine andere ORM ... wie Ebean ORM wo verzögertes Laden funktioniert einfach:)