0

我正在开发一个项目,其中可以将持久数据标记为删除,但保留在数据库中,将列 (is_deleted) 设置为 TRUE。

使用休眠类映射属性“where”并将 where="is_deleted = 0" 添加到标签中可以正常工作。但是当我声明一组子类元素时它失败了。

这个简化的例子使用了包含类“Wheel”的成员集合的“Car”类,它继承自“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 已经有 where="is_deleted = 0",所以逻辑上这应该适用于所有定义的子类?
  • 是否有其他方法可以向 NHibernate 中的所有持久数据添加 is_deleted 标志?

非常感激你的帮助

4

1 回答 1

0

我强烈建议为每个软删除表创建一个视图,以过滤掉已删除的记录并在域模型中映射视图。这样做将使映射更容易。

如果您的数据库支持它,您可以在表上创建一个 INSTEAD OF DELETE 触发器来设置 is_deleted 标志而不是删除记录。结合视图可以让您的域模型完全忽略软删除。

于 2010-02-23T16:54:48.080 回答