3

以下のフレーズの意味を簡単に説明していただけますか。

遅延ロードするように指定またはデフォルト設定されている関係は、getter メソッドを使用してオブジェクトにアクセスするときに、関連するオブジェクトがロードされる場合とロードされない場合があります。オブジェクトはプロキシである可能性があるため、実際にメソッドを呼び出すと、障害が発生する可能性があります。(Pro JPA 2: Java Persistence API のマスター、102 ページ)

私の質問は次のとおりです。

  1. getLazyLoadedObj() メソッドの後でも lazy_loaded_object がロードされない可能性があるということですか?
  2. 最初の質問に対する答えが「はい」の場合、getLazyLoadedObj() メソッドから何が返されるのでしょうか?
  3. lazy_loaded_object がプロキシの場合、何が変わるのかまだわかりません。説明してください。

前もって感謝します。

4

2 に答える 2

5

答えるには 1) はい。2) と 3) を理解するために、例を見てみましょう

あなたがクラスを持っていて、Parentそれが持っているとしましょうChildChildを遅延ロードするように定義します。

class Parent {

  Child chil;

  //FetchMode = lazy
  public Child getChild() {
      return child;
  }

}

Parentたとえば、すでに hibernate セッションを使用してインスタンスをロードしているとします。parent

parent.getChild();これで、返されるオブジェクトを呼び出すと、のインスタンスにChildなるか、Proxyになる可能性があります。

プロキシとは何ですか?

プロキシはクラスのインターセプターのようなものです.のメソッドChildが呼び出される直前にchild呼び出されるプロキシ..

たとえば、呼び出すときchild.getName()--> 言ってみましょう

proxy.someProcessing()メソッドが呼び出され、内部的に が呼び出されchild.getName() 、最終的にデータが返されます。

プロキシが必要な理由

遅延読み込みの定義は、必要な場合の読み込みです。child.getName()したがって、プロキシによって呼び出される直前に、proxy.someProcessing()メソッドは DB を呼び出し、CHILD(DB テーブル マップ先Child) の列データを取得し、オブジェクトをロードしchildます。

于 2013-06-28T09:25:33.100 に答える
3

1) はい

2) getter が呼び出されたときにプロパティを設定するための追加のコードを含むモデル オブジェクトのサブクラス。

getPerson()3) たとえば、 Lazily Loaded にアクセスするために呼び出すときに取得するオブジェクトは、次のようになると想像PersonEntityできます。

public class LazyPersonEntity extends PersonEntity {

  private PersonEntity lazilyLoadedPerson;

  @Override
  public String getName() {
    if (lazilyLoadedPerson == null) {
      lazilyLoadedPerson = runQueryToLoadPerson();
    }
    return lazilyLoadedPerson.getName();
  }
}

生成されたコードが実際にどのように見えるかは明らかではありませんが、機能的にはそうなっています。したがって、getPerson() 取得したことを実行するとのインスタンスでLazyPersonEntityあり、呼び出すまでクエリはまだありませんgetName()

于 2013-06-28T09:22:32.410 に答える