Animal と Dog のタイプについては、次の定義があります。オブジェクトの ID は AnimalID であることに注意してください。
<class name="Animal" table="Animals">
<id name="Id" type="System.Int32" column="AnimalID">
<generator class="identity" />
</id>
<property name="IsBig" column="IsBig" type="System.Bool" not-null="true" />
</class>
<joined-subclass name="Dog" table="Dogs" extends="Animal">
<key column="AnimalID" />
<property name="OwnerID" column="OwnerID" type="System.Int32" non-null="true" />
<property name="IsStrong" column="IsStrong" type="System.Bool" non-null="true" />
</joined-subclass>
データベースに次の情報があるとします。
in table Animals:
AnimalID IsBig
-------- -----
10 True
in table Dogs:
AnimalID OwnerID IsStrong
-------- ------- --------
10 1 True
10 2 False
最初に、OwnerID = 1 の Dog をクエリします。同じセッションで、OwnerID = 2 の Dog をクエリします。NHibernate のセッション キャッシュのため、2 番目のクエリは、OwnerID = 1 で IsStrong = True の Dog オブジェクトを返します。 OwnerID = 2 および IsStrong = False の Dog オブジェクトを返す必要があります。
NHibernate は ID (主キー) 列によってオブジェクトを自動的にキャッシュするため、Dog を 2 回目に要求すると、同じキーを持つオブジェクトを取得することになります。オブジェクトで ISession.Evict() を呼び出すことでこの問題を解決できますが、これはハックのようです。
より良い提案はありますか?