多対多の関係を持つ熱心なロード - のGrails(GORM)
-
21-09-2019 - |
質問
それぞれの本は多くの著者を持つことができます。そして、それぞれの著者が多くの書籍を作成できます。
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のにつながる)、今では、再帰的になるだろう参照してください。それがフェッチ熱心にやっているとき、それは正確にどのように動作するか、誰を知っていますか?
解決
休止状態管理のインスタンスがロードされると、それは定期的、または不定期に、ロードされたのかどうか、あなたがまた、第二レベルのキャッシュを設定した場合、その後のインスタンスもあるでしょう(その第一レベルのキャッシュである、HibernateのSessionに保存されます彼らは以前にロードされた場合は)そこから来ている可能性があります。
だから、本をロードした、とその作者のコレクション(デフォルトで設定)をロードした、それぞれの著者の本は、セッション中にすでにあるので、データベースにアクセスしてくださいする必要はありません。
熱心にマッピングされたコレクションをロードすると、トップレベルのインスタンスプラスワンのデータベースクエリ内の子インスタンスをつかむために、最初のResultSetを使用しています。なまけコレクションをロードするだけのコレクションを移入するために第二のデータベースクエリが必要ですが、必要な場合にのみ、コレクションをロードするという利点があります。
他のヒント
は、より明確にするために、あなたはでhttpバート・ベックウィズによって書かれたブログを参照することができます:// burtbeckwith。 COM /ブログ/?p = 169 と、あなたもブログで与えられたプレゼンテーションリンクを介して行くことができます。