2

各本には多くの著者を含めることができます。また、各著者は多くの本を執筆できます。

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

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

今、私はいつできますか:

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

今、私は各著者を連れて行き、彼が関連する本を手に入れることができるはずだと考えています:

authors.each {
   it.books
}

これで、再帰的になることがわかります (stackoverflow につながります)。熱心なフェッチを行っているときに、それが正確にどのように機能するかを知っている人はいますか?

4

2 に答える 2

1

熱心にロードされるか遅延ロードされるかに関係なく、Hibernate マネージド インスタンスがロードされると、その第 1 レベルのキャッシュである Hibernate セッションに保持されます (第 2 レベルのキャッシュも構成した場合、インスタンスも存在し、それらが以前にロードされていた場合は、そこから来ます)。

したがって、書籍をロードし、その著者コレクション (デフォルトでは Set) をロードすると、各著者の書籍はすでにセッションにあるため、データベースにアクセスする必要はありません。

マップされたコレクションを積極的にロードすると、最初の ResultSet を使用して、最上位のインスタンスと子インスタンスを 1 つのデータベース クエリで取得します。コレクションを遅延ロードするには、コレクションにデータを入力するために 2 番目のデータベース クエリが必要ですが、必要な場合にのみコレクションをロードするという利点があります。

于 2009-09-02T02:27:23.700 に答える
1

より明確にするために、 http://burtbeckwith.com/blog/ ? p=169 で Burt Beckwith によって書かれたブログを参照できます。また、ブログで提供されているプレゼンテーション リンクを参照することもできます。

于 2009-09-02T04:09:12.733 に答える