nhibernateのlazy="true"
との違いは何ですか?lazy="proxy"
4 に答える
別の考え方はこれだろうと思います。
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は不明であり、別の表にあります)
lazy = "proxy"は、NHibernateがクラスのインスタンスを遅延初期化することを意味します。NHibernateがデータベースからクラスのインスタンスを取得すると、この場合はクラスの「実際の」インスタンスは返されませんが、プロキシが返されます。つまり、別のタイプのオブジェクト、より具体的には、クラスのサブクラスであるオブジェクト(NHibernateによってIL生成によって生成された)を返します。
与えられるオブジェクトはプロキシであり、入力された唯一のプロパティはIdプロパティです。インスタンスで別のプロパティを呼び出すとすぐに、NHibernateはプロキシを初期化し、データベースから他のすべてのプロパティ/コレクション(遅延ロードされたものを除く)を取得します。
Lazy="true"は別のレベルで使用されます。lazy = "proxy"はクラスレベルで使用されますが、lazy="true"はコレクションレベルで使用されます。これは、コレクションを遅延ロードする必要があることを意味します。
ドキュメント リファレンスによると、プロキシ属性の値は次の場所にあります。
lazy="proxy|no-proxy|false"
lazy (オプション - デフォルトはプロキシ): デフォルトでは、単一ポイントの関連付けがプロキシされます。
lazy="no-proxy" は、インスタンス変数が最初にアクセスされたときにプロパティを遅延フェッチすることを指定します (ビルド時にバイトコード インストルメンテーションが必要です)。
lazy="false" は、関連付けが常に熱心にフェッチされることを指定します。
デフォルトでは、Hibernate3 はコレクションに対して遅延選択フェッチを使用し、単一値の関連付けに対して遅延プロキシフェッチを使用します。これらのデフォルトは、ほとんどのアプリケーションのほとんどの関連付けに適しています。
http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-fetching-lazy