1

我使用 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 强制我声明一个鉴别器元素,这对我来说不是必需的。

有没有办法做到这一点 ?

4

1 回答 1

0

不,它们是两个独立的对象,每个对象在缓存中都有自己的身份。可能的解决方法是禁用轻量对象的缓存或在加载重对象时从缓存中逐出轻量对象。在我看来,在同一会话中加载重物和轻物似乎违背了目的。

于 2012-11-30T14:07:33.120 回答