Картографирование NHibernate. Установить коллекцию объединенных элементов объединенных подклассов и свойство where - PullRequest
0 голосов
/ 23 февраля 2010

Я работаю над проектом, в котором сохраненные данные могут быть помечены для удаления, но остаются в базе данных, для столбца (is_deleted) которого установлено значение TRUE.

Это прекрасно работает, используя свойство отображения класса hibernate "where" и добавляя where = "is_deleted = 0" к тегам. Но это не помогает, когда я объявляю набор элементов подкласса.

В этом упрощенном примере используется класс "Car", содержащий коллекцию членов класса "Wheel", которая наследуется от класса "CarPart":

<class name="Car" where="is_deleted = 0">
  <id name="Identifier" column="car_id">
    <generator class="native" />
  </id>
  <set name="Wheels" lazy="true" where="is_deleted = 0">
    <key column="car_id" />
    <one-to-many class="Wheel" />
  </set>
</class>

<class name="CarPart" where="is_deleted = 0">
  <id name="Identifier" column="part_id">
    <generator class="native" />
  </id>
  <property name="IsDeleted" />

  <joined-subclass name="Wheel" >
    <key column="part_id" />
    <property name="radius" />
  </joined-subclass>
</class>

Если я в коде пытаюсь получить доступ к коллекции Car.Wheels Я получаю ошибку SQL, потому что предложение "where" применяется к таблице подкласса "Wheel" вместо своего суперкласса "CarPart", где свойство IsDeleted фактически определено.

Сгенерированный SQL выглядит примерно так:

select * from Wheel w inner join CarPart cp on...
where w.is_deleted = 0

вместо правильного

select * from Wheel w inner join CarPart cp on...
where cp.is_deleted = 0
  • Это ошибка? Или я скучаю по подробно? Суперкласс CarPart уже имеет где = "is_deleted = 0", так логично это должно относиться ко всем определенные подклассы?
  • Существуют ли другие способы добавления Флаг is_deleted для всех сохраненных данных в NHibernate?

Ваша помощь очень ценится

1 Ответ

0 голосов
/ 23 февраля 2010

Я настоятельно рекомендую создавать представление для каждой таблицы мягкого удаления, которая отфильтровывает удаленные записи и отображает представление в вашей модели домена. Это значительно упростит картографию.

Если ваша база данных поддерживает это, вы можете создать триггер INSTEAD OF DELETE для таблиц, чтобы установить флаг is_deleted вместо удаления записи. Это в сочетании с представлениями позволяет модели вашего домена полностью игнорировать мягкие удаления.

...