14 Stimmen

Lazy Loading in Hibernate deaktivieren

Wie kann ich "Lazy Loading" in Hibernate deaktivieren? Ich verwende Persistenz-Annotationen und keine hbm-xml-Datei.

Ich rufe ein einzelnes Objekt nach ID ab und möchte, dass alle Eigenschaften geladen werden. Die Sitzung wird geschlossen, bevor ich das Objekt verwende.

Danke!

0 Stimmen

Meine Ergänzung zu dieser Frage: Wie kann ich "Lazy Loading" so deaktivieren, dass anstelle von Proxies leere Sammlungen erscheinen würden?

7voto

Sean Adkinson Punkte 8107

Sie müssen die Eigenschaften, die nicht automatisch geladen werden sollen, mit FetchType.EAGER kennzeichnen

   @ManyToOne(fetch = FetchType.EAGER)

Sie sehen, es ist nicht das Objekt, das Sie laden, das "lazy loaded" ist. Vielmehr sind die Assoziationen des Objekts träge, und Sie müssen ihnen sagen, dass sie es nicht sein sollen, wenn das Ihr gewünschtes Verhalten ist.

Wenn diese Objekte auch Assoziationen haben, die eagerly geladen werden sollen, müssen Sie diese ebenfalls mit Anmerkungen versehen.

0voto

JB Nizet Punkte 654813

Sie könnten angeben fetch = FetchType.EAGER auf alle Ihre Assoziationen, rekursiv, aber dies würde eine ganze Reihe von Daten laden, die Sie wahrscheinlich nicht interessiert sind.

In der Regel ist es eine bessere Lösung, zumindest alle OneToMany- und ManyToMany-Verknüpfungen auf LAZY zu setzen (was die Standardeinstellung ist) und sie vor dem Schließen der Sitzung zu initialisieren, wenn Ihr Anwendungsfall sie benötigt (oder sie sogar mit einer Ad-hoc-Abfrage zu laden).

OneToOne- und ManyToOne-Verknüpfungen sind standardmäßig EAGER, und das erzeugt schon oft zu viele Anfragen. Ich ziehe es normalerweise vor, alles als faul zu markieren, es sei denn, alle Anwendungsfälle müssen die Assoziation abrufen.

0voto

Kuntal-G Punkte 2880

Verwenden Sie fetch = FetchType.EAGER für alle Sammlungen und Entitäten, bei denen die Faulheit ausgeschaltet werden soll.

Sehen Sie sich auch dies an: http://techblog.bozho.net/?p=645

0voto

Schreiben Sie fetch = FetchType.EAGER in der oneToMany-Anmerkung.

wie dieses : @OneToMany(fetch = FetchType.EAGER)

Achtung: Wenn Ihre Datenbank so groß ist und viele Beziehungen enthält, kann dies Ihren Datenbankprozess sehr stark erhöhen;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X