我正在开发一个项目,其中持久化数据可以被标记为删除,但保留在数据库中,列(is_deleted)设置为TRUE。
使用hibernate类映射属性“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”子句适用于子类的表“转而使用超级“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
非常感谢您的帮助
答案 0 :(得分:0)
我强烈建议为每个软删除表创建一个视图,以过滤掉已删除的记录并在域模型中映射视图。这样做会使映射变得更加容易。
如果您的数据库支持它,您可以在表上创建INSTEAD OF DELETE触发器以设置is_deleted标志而不是删除记录。与视图结合使用,您的域模型可以完全忽略软删除。