web-dev-qa-db-ja.com

nhibernateの遅延ロードオプション

違いは何ですか lazy="true"およびlazy="proxy" nhibernateで?

26
Ajay

これについては別の考え方があるのではないかと思います。

class Foo
{
   public virtual Bar SingleBar { get; set; }
   public virtual ICollection<Bar> MultiBar { get; set; }
}
  • lazy = "proxy"は単一のオブジェクト(つまり、foo.SingleBar)に適用されます
  • lazy = "true"は、オブジェクトのコレクション(つまり、foo.MultiBar)に適用されます

(lazy = "proxy"をコレクションに設定したり、lazy = "true"を単一の参照に設定したりすることはできません。どちらの場合も、NHは初心者には少しわかりにくいXmlSchemaExceptionをスローします。)

運用上、これらは同じ抽象的なことを行います。プロパティにアクセスしたときに、NHibernateがデータベースにアクセスしてプロパティを設定します。

ただし、オブジェクトをフェッチするために必要なもののため、実装にはわずかな違いがあります(単一のケースでは、参照のID(Bar)は親エンティティ(Foo)でロードされました。コレクションのケースでは、IDは不明であり、別の表にあります)

23
fostandy

lazy = "proxy"は、NHibernateがクラスのインスタンスを遅延初期化することを意味します。 NHibernateがデータベースからクラスのインスタンスを取得すると、この場合、クラスの「実際の」インスタンスは返されませんが、プロキシが提供されます。つまり、別のタイプのオブジェクト、より具体的には、クラスのサブクラスであるオブジェクトを返します(IL生成を通じてNHibernateによって生成されます)。

与えられるオブジェクトはプロキシであり、唯一の設定されたプロパティはIdプロパティです。インスタンスで別のプロパティを呼び出すとすぐに、NHibernateはプロキシを初期化し、他のすべてのプロパティ/コレクション(遅延ロードされたものを除く)をデータベースから取得します。

Lazy = "true"は別のレベルで使用されます。 lazy = "proxy"がクラスレベルで使用されるのに対し、lazy = "true"はコレクションレベルで使用されます。これは、コレクションを遅延ロードする必要があることを意味します。

18

ドキュメント参照 は、プロキシ属性の値が次の場所にあることを示しています。

lazy="proxy|no-proxy|false"

レイジー(オプション-デフォルトはプロキシ):デフォルトでは、単一ポイントの関連付けがプロキシされます。

lazy = "no-proxy"は、インスタンス変数が最初にアクセスされたときにプロパティが遅延フェッチされることを指定します(ビルド時のバイトコードインスツルメンテーションが必要です)。

lazy = "false"は、関連付けが常に積極的にフェッチされることを指定します。

9
instanceof me

デフォルトでは、Hibernate3はコレクションには遅延選択フェッチを使用し、単一値の関連付けには遅延プロキシフェッチを使用します。これらのデフォルトは、ほとんどのアプリケーションのほとんどの関連付けに意味があります。

http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-fetching-lazy

2
Ali Abdel-Aziz