2

私は Hibernate を学ぼうとしていhibernate lazy initializationます。に関していくつかの説明がありますlazy initialization.

まず、いわゆる遅延初期化とは何ですか? 第二に、いつ行けばいいですか?次に、ブログで、それを使用するとパフォーマンスが向上し、その方法を知る必要があると言っているのに出くわしました。では、それを使用することの短所はありますか?これを理解するのを手伝ってくれる人はいますlazy initializationか?

4

3 に答える 3

9

遅延フェッチ (または初期化) は、熱心なフェッチの反対です。hibernate のデフォルトである遅延フェッチは、レコードがデータベースからロードされるときに、1 対多の関係の子行がロードされないことを意味します。例えば

@Entity
@Table(name = "COMPANY")
public class Company {
...
@OneToMany(fetch = FetchType.LAZY)
private Set<Employee> employees = new HashSet<Employee>();

会社のレコードを要求しても従業員は返されません (設定されません)。従業員は別のクエリで要求する必要があります。

利点

  • パフォーマンス。従業員は、必要なとき (および要求されたとき) にのみ読み込まれます。CPU、メモリ、帯域幅の利点... (Java 側と SQL サーバー側の両方)。

欠点

  • Employees も必要な場合は、別のクエリを実行する必要があります。

Employees に対するクエリは、同じセッション中に実行する必要があることに注意してください (そうしないと、有名なLazyInitializationExceptionは歓迎されません)。

このページには興味深い情報が掲載されています。

于 2013-03-19T07:32:29.260 に答える
3

レイジー設定は、親オブジェクトのロード中に子オブジェクトをロードするかどうかを決定します。この設定は、親クラスのそれぞれの休止状態マッピング ファイルを行う必要があります。Lazy = true(子をロードしないことを意味します) デフォルトでは、子オブジェクトの遅延ロードは true です。getChild()これにより、親のメソッドを呼び出してアプリケーションで明示的に呼び出されない限り、子オブジェクトが読み込まれないことが保証されます。この場合、hibernategetChild()は、親オブジェクトで実際に呼び出されたときに、子をロードするための新しいデータベース呼び出しを発行します。ただし、場合によっては、親が読み込まれるときに子オブジェクトを読み込む必要があります。を作成するだけでlazy=false、hibernate は、親がデータベースからロードされるときに子をロードしますlazy=truelazy=falseただし、オンライン書店で本を扱うときはいつでも、Book 親の Author オブジェクトをロードする必要がある場合があります。

于 2013-11-18T07:17:39.097 に答える
3

遅延初期化とは、遅延読み込みを意味します。

ごくわずかな言葉で-

最初に必要なときにオブジェクトを初期化すると、不要なオブジェクトがロードされないため、高いパフォーマンスが得られます。」

たとえば、複数のテーブルを結合したレコードが必要だとします。すべてを一度にフェッチすると、たとえばメイン テーブルのみをフェッチする場合よりも時間がかかります。遅延読み込みを使用すると、残りの情報は必要な場合にのみ取得されます。したがって、実際にefficient-loadingは特定のシナリオにあります。

于 2013-03-19T07:27:11.980 に答える