Frage

Jedes Buch kann viele Autoren haben. Und jeder Autor kann viele Bücher autorieren.

class Book {
   static belongsTo = Author
   static hasMany = [authors:Author]
}

class Author {
   static hasMany = [books:Book]
}

Wann kann ich jetzt:

def book = Book.get(id)
def authors = book.authors

Jetzt denke ich, ich sollte in der Lage sein, jeden Autor mitzunehmen und die Bücher zu bekommen, mit denen er verbunden ist:

authors.each {
   it.books
}

Sie sehen jetzt, dass es rekursiv wird (was zu Stackoverflow führt). Weiß jemand, wie es genau funktioniert, wenn es eifrig macht?

War es hilfreich?

Lösung

Egal, ob es eifrig oder faul geladen ist, sobald eine von Winterschlafverwaltungen geladene Instanz in der Hibernate-Sitzung aufbewahrt wird, ist der Cache der ersten Ebene (wenn Sie auch einen Cache der zweiten Ebene konfiguriert haben, werden auch Instanzen da sein und möglicherweise haben Komm von dort, wenn sie zuvor geladen wurden).

Nachdem das Buch das Buch geladen und dann seine Autorensammlung (standardmäßig eingestellt) geladen hat, befindet sich das Buch jedes Autors bereits in der Sitzung, sodass nicht in die Datenbank gehen muss.

Das Laden einer zugeordneten Sammlung verwendet das erste Ergebnis, um die Instanz der obersten Ebene sowie die untergeordneten Instanzen in einer Datenbankabfrage zu greifen. Wenn Sie die Sammlung träge geladen haben, ist nur eine zweite Datenbankabfrage erforderlich, um die Sammlung zu füllen, aber sie hat den Vorteil, dass die Sammlung bei Bedarf nur geladen wird.

Andere Tipps

Für mehr Klarheit können Sie sich auf den von Burt Beckwith geschriebenen Blog beziehen http://burtbeckwith.com/blog/?p=169 Und Sie können auch den im Blog angegebenen Präsentationslink durchlaufen.

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