web-dev-qa-db-ja.com

hibernateのlazy = "true"とfetch = "select"の違いは何ですか?

lazy=true属性は、親コレクションと子コレクションの遅延読み込みを有効にし、同じfetch="select"属性を有効にします。 Hibernateのlazy="true"fetch="select"に違いはありますか?.

12
user1127214

はい。

lazy属性は、休止状態whenに子を取得するように指示します。

fetch属性は、休止状態howに子を取得するように指示します。

あなたが言う時

Lazy = true属性は、親コレクションと子コレクションの遅延読み込みを有効にし、同じものをfetch = "select"属性にします。

それは完全に間違っています。選択フェッチ戦略は、遅延読み込みをオフにすることと同じではありません。実際、 ドキュメントから

フェッチの選択:2番目のSELECTは、関連付けられたエンティティまたはコレクションを取得するために使用されます。 lazy = "false"を指定して遅延フェッチを明示的に無効にしない限り、この2番目の選択は、関連付けにアクセスしたときにのみ実行されます。

21
hvgotcodes

_fetch="select"_と言うと、それが_lazy ="false"_であっても、関連付けオブジェクトを取得するために常に個別のクエリを実行します。

ただし、_lazy ="true"_とは、別のクエリで関連付けオブジェクトを取得することを意味しますが、オブジェクトの読み込み時ではなく、関連付けが最初にアクセスされたときに取得されます。 list().size()と言うことでそれを行うことができます。

_fetch="join"_と言うと、データベースから関連付けオブジェクトを取得するために、常に1つのクエリが実行されます。

14
Chiranjit Dutta

Hibernateでのn個のクエリ(親子関係)のn + 1 select問題を解決するには、fetch="join"の代わりにfetch="select"を使用します。レイジー設定は、親オブジェクトのロード中に子オブジェクトをロードするかどうかを決定します。この設定は、親クラスのそれぞれのHibernateマッピングファイルを行う必要があります。 lazy="true"は、子をロードしないことを意味します。デフォルトでは、子オブジェクトの遅延読み込みはtrueです。

1
sreenivas