2

次のようなオブジェクトを検討してください。

public partial class Record
{
    public int RecordID {get; set;}
    public DateTime? Created { get; set; }
    public int CreatorUserUserObjectNDX { get; set; }
    public UserObject Creator { get; set; }
    ...
}

public partial class UserObject
{
  public virtual int ID {get; set;}
  public virtual string Name {get; set;}
}

そしてそれらのマッピングは次のようになります:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="..." namespace="..." assembly="...">
<class name="Record" table="records" lazy="false" schema="..">
    <id name="RecordID" column="ndx">
        <generator class="native" />
    </id>
    <property name="Created" column="created" />
    <property name="CreatorUserUserObjectNDX" column="creator_user_user_object_ndx" />

    <many-to-one name="Creator" column="creator_user_user_object_ndx" lazy="proxy"/>
</class>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="..." namespace="..." assembly="...">
<class name="UserObject" table="user_objects" lazy="false">
    <id name="NDX" column="ndx">
        <generator class="native" />
    </id>

    <property name="Name" column="name" />
</class>

ここでは意図的にシンプルにしていますが、実際には 1 対多のコレクションなどでより重くなっていますが、これらは機能するので、ここでは重要ではありません。

私が遭遇した問題は、これらのような定義とマッピングを使用し、単純な

var results = session.QueryOver<Record>()
  .List();

NHibernate はプロパティのプロキシを作成しません。creator実行された SQL ステートメントで左外部結合を使用し、UserObject直接挿入します。UserObject のマッピング内に変更lazy='false'すると、プロキシが作成され、実行された SQL に外部結合がなくなります。lazy='true'

では、すべてのクラスに対して厳密に設定する必要がlazy='true'ありますか?それはどこでも参照される可能性がありますか? 必要に応じて、すべてのマッピングに対してデフォルトで false に設定lazy='proxy'し、多対 1 の定義で設定できると考えました。

私は NHibernate 3.2 を使用しているため、proxyfactory に関する設定はありません。ここで何が欠けていますか?

4

1 に答える 1

3

マッピングで lazy=false を設定すると、NHibernate がプロキシを作成する必要がなくなります。これは、すべてのプロパティが積極的に読み込まれるためです。

積極的な読み込みが必要でない限り、遅延読み込みの設定を変更しないでください。その場合でも、「fetch」を使用して (hql などで) 必要なものを積極的に読み込むことができます。

于 2012-08-15T11:46:26.910 に答える