18

NHibernateを使用してマッピングしているレガシーデータベースがあります。対象となるオブジェクトは、アカウントと通知オブジェクトのリストです。オブジェクトは次のようになります。

public class Notification
{
    public virtual int Id { get; set; }
    public virtual DateTime BatchDate { get; set; }
    /* other properties */

    public virtual Account Account { get; set; }
}

public class Account 
{
    public virtual int Id { get; set; }
    public virtual string AccountNumber { get; set; }
    /* other properties */ 
}

マッピングファイルは次のようになります。

<class name="Account" table="Account" dynamic-update="true">
<id name="Id" column="AccountID">
    <generator class="native" />
</id>
<property name="AccountNumber" length="15" not-null="true" />
    <!-- other properties -->
</class>

<class name="Notification" table="Notification">
    <id name="Id" column="Id">
        <generator class="native" />
    </id>
    <!-- other properties -->
    <many-to-one name="Account" class="Account" property-ref="AccountNumber" lazy="proxy">
        <column name="AcctNum" />
    </many-to-one>

ただし、次のような基準を作成すると

return session.CreateCriteria(typeof(Notification)).List<Notification>();

アカウントが参照されていなくても、各アカウントが読み込まれるSelect N+1のケースが発生します。多対1がレイジープロキシとしてマッピングされているのに、なぜすべてのアカウントが読み込まれるのですか?

4

1 に答える 1

15

この問題は、property-ref属性が原因で発生します。遅延読み込みは、参照が他のオブジェクトの主キーを使用している場合にのみ機能しmany-to-oneます。NHibernate は、そのような値の有効性を強制する外部キー制約があると想定しているためです。非主キー (property-ref で示される) では、NHibernate はこの仮定を行わないため、関連するオブジェクトが存在しなければならないと仮定しません。存在しないオブジェクトのプロキシを作成したくないため (つまり、プロキシではなく null にする必要があります)、リモート オブジェクトを熱心にフェッチします。が指定されている場合も、これと同じ問題が発生しnot-found="ignore"ます。これは、外部キー関係が適用されず、null 参照になる可能性があることを示しているためです。

以下も参照してください。

于 2010-09-30T16:11:32.870 に答える