@SoftDelete
向实体 Bean 添加一个布尔属性以指示已删除状态。此属性可以位于实体 Bean 上或位于 MappedSuperclass 上,如下面的示例所示
此属性必须为布尔类型,其中 true 值表示行/Bean 已被逻辑删除。
@MappedSuperclass
public class BaseSoftDelete {
@Id
Long id;
@Version
Long version;
@SoftDelete
boolean deleted;
删除
具有 SoftDelete 的实体 Bean 的删除将变为 SQL 更新。
// delete becomes an update if the bean has soft delete property
database.delete(bean);
-- soft delete ... sets deleted = true
update mybean set version=?, deleted=? where id=? and version=?; --bind(2,true,1,1,)
永久删除
永久删除用于执行 SQL 删除(硬删除)。
// delete becomes an update if the bean has soft delete property
database.deletePermanent(bean);
-- delete permanent
delete from mybean where id=? and version=?; --bind(1,2,)
级联行为
只要 Bean 支持软删除,软删除就会沿与硬删除相同的关联级联。如果“目标”Bean 没有@SoftDelete
属性(因此不支持软删除),则软删除将不会级联到该关联。
ManyToMany
软删除不会级联到@ManyToMany
的交集表。
可草稿
软删除不会传播到 @Draftable 实体 Bean 的关联“活动”行。
查询(正常)
正常查询会自动包含一个谓词,以过滤掉已软删除的行。为具有软删除列的每个表(SQL FROM 或 JOIN)添加一个谓词。这将针对任何后续的惰性加载查询(如有必要)执行。
and t0.deleted=false and t1.deleted=false ... 其他谓词
select t0.id c0, t0.name ...
from ebasic_soft_delete t0
left outer join ebasic_sdchild t1 on t1.owner_id = t0.id
where t0.id = ?
-- Additional predicates for soft delete
and t0.deleted=false and t1.deleted=false
order by t0.id; --bind(1)
查询 - includeSoftDeletes
可以将查询设置为includeSoftDeletes()
,在这种情况下,不会将软删除谓词添加到查询中,这意味着结果中将包含所有行,包括已软删除的行。
Query.includeSoftDeletes()
// find a bean that could be soft deleted
List<MyBean> beans =
database.find(MyBean.class)
.includeSoftDeletes()
.where().icontains("name", "rob")
.findList();
// find a bean that could be soft deleted
MyBean bean =
database.find(MyBean.class)
.includeSoftDeletes()
.setId(idValue)
.findOne();
通知
对于 BeanPersistController、BeanPersistListener、L2 缓存和集群通知,软删除与硬删除的处理方式相同,并且会发生相同的事件通知。
变更日志
对于变更日志,软删除被视为更新,因为这反映了实际发生的变更。