私は NHibernate 3.2 と appfabric 1.1 を第 2 レベルのキャッシュに使用しています。同じテーブルに 2 つのクラスをマップしました。最初のクラスAFullEntity (サンプルでは MonitorLayoutData) は、軽量クラス (MonitorLayout) である 2 番目のクラスを継承します。MonitorLayoutData には、基本クラスには存在しない重いプロパティが含まれています。例えば :
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Entities.MonitorLayout,Entities" table="MonitorLayouts2" lazy="false" schema="dbo" polymorphism="explicit">
<cache usage="nonstrict-read-write"/>
<id name="Id" column="MonitorLayout_ID" type="int">
<generator class="native" />
</id>
<property name="Name" column="MonitorLayout" type="string" />
<property name="UserId" column="User_ID" type="int" />
<property name="IsPublic" column="IsPublic" type="Boolean" not-null="true" />
<property name="ViewGuid" column="ViewGuid" type="string" not-null="true" />
<property name="TreeNode" column="TreeNode" type="string" />
<property name="IncludeNodeChildren" column="IncludeNodeChildren" type="Boolean" />
</class>
<class name="Entities.MonitorLayoutData,Entities" table="MonitorLayouts2" lazy="false" schema="dbo" polymorphism="explicit">
<cache usage="nonstrict-read-write"/>
<id name="Id" column="MonitorLayout_ID" type="int">
<generator class="native" />
</id>
<property name="Name" column="MonitorLayout" type="string" />
<property name="UserId" column="User_ID" type="int" />
<property name="IsPublic" column="IsPublic" type="Boolean" not-null="true" />
<property name="ViewGuid" column="ViewGuid" type="string" not-null="true" />
<property name="TreeNode" column="TreeNode" type="string" />
<property name="IncludeNodeChildren" column="IncludeNodeChildren" type="Boolean" />
<property name="LayoutData" column="LayoutData" type="BinaryBlob" not-null="false"/>
</class>
</hibernate-mapping>
これらのクラスは、明示的なポリモーフィズムを使用して、ドキュメントのメモのように、選択したタイプのエンティティのみを取得します。「明示的なポリモーフィズムは、2 つの異なるクラスが同じテーブルにマップされている場合に役立ちます (これにより、テーブルのサブセットを含む「軽量」クラスが可能になります)。列)」。
ただし、エンティティがキャッシュされると問題が発生しました。AFullEntity を更新すると、軽量クラスで変更が報告されず、これは大きな問題です。サブクラスやエクステンドなどの他のメカニズムを試してみましたが、NHibernate は私には必要のない識別子要素を宣言するように強制します。
これを行う方法はありますか?