次のようなオブジェクトを検討してください。
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 に関する設定はありません。ここで何が欠けていますか?