NHibernate二级缓存不会使同一个表上的实体映射无效

时间:2012-11-29 16:52:06

标签: nhibernate appfabric second-level-cache

我正在使用NHibernate 3.2和appfabric 1.1进行二级缓存。 我在同一个表上映射了2个类。第一个类 AFullEntity (示例中的MonitorLayoutData)继承了第二个类,它是轻量级类(MonitorLayout)。 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>

这些类使用显式多态来仅检索所选类型的实体,如文档中的注释:“当两个不同的类映射到同一个表时,显式多态性很有用(这允许包含子集的”轻量级“类表格列)“。

然而,当实体被缓存时我遇到了问题。当我更新AFullEntity时,更改不是轻量级类中的报告,这对我们来说是一个大问题。 我尝试其他机制,如子类或扩展,但NHibernate强迫我声明一个鉴别器元素,这对我来说是不必要的。

有办法吗?

1 个答案:

答案 0 :(得分:0)

不,它们是两个独立的对象,每个对象在缓存中都有自己的标识。可能的解决方法是禁用轻量级对象的缓存,或者在加载重型对象时从缓存中逐出轻量级对象。在同一个会话中加载重物和轻物在我看来是打败了目的。

相关问题