Кэш 2-го уровня NHibernate не делает недействительной карту сущностей в той же таблице

Я использую NHibernate 3.2 с appfabric 1.1 для кеша 2-го уровня. У меня есть 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 вынуждает меня объявлять элемент дискриминатора, который мне не требуется.

Есть ли способ сделать это?


person Koektudis    schedule 29.11.2012    source источник
comment
Вы просматривали Lazy Property вместо того, чтобы создавать подклассы? ?   -  person Sathish Naga    schedule 23.06.2014


Ответы (1)


Нет, это два отдельных объекта, каждый со своим идентификатором в кеше. Возможным обходным решением может быть отключение кэширования для легковесных объектов или удаление легковесного объекта из кэша при загрузке тяжелого объекта. Мне кажется, что загрузка тяжелых и легких объектов в одном и том же сеансе противоречит цели.

person Jamie Ide    schedule 30.11.2012
comment
Я уже знаю, что есть 2 отдельных объекта, я ищу механизм для аннулирования связанных объектов. Сначала хотелось бы использовать механизм подкласса, но кажется невозможным использовать его без дискриминатора. Во-вторых, я нашел интерфейс ILifecycle, который мог решить проблему. Но это уродливое решение. EntityInterceptor может быть третьим решением. - person Koektudis; 30.11.2012