例として、私の国の収益サービスのデータベースの「人」エンティティをモデル化する必要があり、私の非常に小さな国では、人の名前と名前で一意に識別できるとしましょう。人。さらに、歳入サービスのデータベースは代理キーを使用せず、それに代理キーを追加すると、今後10年間は国のGDPがゼロになります。
Personsテーブルには3つのフィールドがあります。
- ファーストネーム
- 苗字
- 現住所
そして、私の国のサイズを考えると、テーブルには< FirstName、LastName >列のペアに一意の制約があります。
このスキーマを考えると、私の非常に単純なPersonクラスには次のメンバーがあります。
- Key:PersonKeyクラスのインスタンス。これには、FirstNameメンバーとLastNameメンバーがあり、もちろんEquals()とGetHashCode( )を実装します。
- CurrentAddress:単純な文字列。
NHibernateマッピングは次のようになります。
<class name="Person" table="Persons" lazy="false">
<composite-id name="Key" class="PersonKey">
<key-property name="FirstName" type="string" column="FirstName"/>
<key-property name="LastName" type="string" column="LastName"/>
</composite-id>
<property name="CurrentAddress" type="string" column="CurrentAddress" not-null="true" />
</class>
これまでのところ、このマッピングは正常に機能しており、DBからPersonエンティティを問題なくロードできます。
ただし、内部を見ると、セット全体をロードすると、NHibernateは次のことを実行することがわかります。
- レコードセットを開いて、 Personsテーブルから主要なプロパティのみ(つまり、FirstNameフィールドとLastNameフィールドのみ)をロードします。
- Personsからロードされた< FirstName、LastName >のペアごとに、SELECTを発行して(もちろんPersonsに対しても)、そのFirstNameとLastNameを持つ人のCurrentAddressをロードします。
つまり、NHibernateは最初にキーをロードし、次に一連のSELECTを発行して、WHERE句でキーを提供する各Personを個別にロードします。
データベースへの書き込みに興味がない場合、単一のレコードセットを使用してテーブルからキープロパティと非キープロパティの両方を取得できることをNHibernateに伝える方法はありますか?