@SoftDelete
削除状態を示す、ブールプロパティをエンティティBeanに追加します。このプロパティはエンティティBean上に置いたり、次の例のような MappedSuperclass 上に置くことができます。
このプロパティは、論理的に削除された行/Bean を意味する true 値を持つ、ブール型である必要があります。
@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
ソフト削除は @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 Cache、およびクラスター通知では、ソフト削除はハード削除と同じように扱われ、同じイベント通知が発生します。
変更ログ
ChangeLog の場合、ソフト削除は実際に行われた変更を反映するため、更新として扱われます。