Question

Chaque livre peut avoir de nombreux auteurs. Et chaque auteur peut l'auteur de nombreux livres.

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

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

Maintenant, quand je peux faire:

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

Maintenant, je pense que je devrais être en mesure de prendre chaque auteur et obtenir les livres qu'il est associé à:

authors.each {
   it.books
}

Vous voyez maintenant il se récursif (conduisant à stackoverflow). Est-ce que quelqu'un sait comment cela fonctionne exactement, quand il fait aggressif?

Était-ce utile?

La solution

Que ce soit avec enthousiasme ou paresseusement chargé, une fois par exemple gérés Hibernate est chargé, il est conservé dans la session Hibernate, qui est son cache 1er niveau (si vous avez également configuré un cache de niveau 2 puis instances seront également là et peut-être venu de là si elles étaient auparavant chargés).

Donc, après avoir chargé le livre, puis avoir chargé sa collection d'auteur (un ensemble par défaut), le livre de chaque auteur est déjà dans la session, donc il n'y a pas besoin d'aller à la base de données.

loading Ardemment une collection mappée utilise le ResultSet initial pour saisir l'instance de haut niveau ainsi que les instances de l'enfant dans une requête de base de données. chargement paresseusement la collection nécessite simplement une requête de base de données 2 pour alimenter la collection, mais il a l'avantage de ne charger la collection si nécessaire.

Autres conseils

Pour plus de clarté vous pouvez vous référer au blog écrit par Burt Beckwith http: // burtbeckwith. com / blog / p = 169 et vous pouvez également passer par le lien de la présentation donnée dans le blog.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top