@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 缓存和集群通知,软删除与硬删除的处理方式相同,并且会发生相同的事件通知。

变更日志

对于变更日志,软删除被视为更新,因为这反映了实际发生的变更。