faul Initialisierung Problem Ruhezustand: LazyInitializationException: failed zu träge eine Sammlung von Rolle initialisieren

StackOverflow https://stackoverflow.com/questions/781751

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?

War es hilfreich?

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:

  1. 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.

  2. Alle Inhalte initialisieren, die Sie vor dem Schließen der Sitzung benötigen. Wenn Sie das ganze Objekt initialisieren Sie Hibernate.initialize (Objekt).

  3. 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:

  1. Just entsprechende Getter nennen. Nach Feld geholt in Bohne ist, ist es dort nach Sitzung geschlossen wird.
  2. 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.
  3. 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:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top