Domaで論理削除をするには

デリゲートを使うと簡単に実現できます。

Daoの定義はこんな感じにします。deleteメソッドに@Delegateをつけるのがポイントです。

@Dao(config = AppConfig.class)
public interface EmployeeDao {

    @Delegate(to = EmployeeDaoDelegate.class)
    int delete(Employee employee);

    @Update
    int update(Employee employee);
}

aptで生成されるDaoの実装クラスでは、deleteメソッドの実装は次のようになります。@Delegateのto要素に指定されたEmployeeDaoDelegateをnewして同名のメソッドを呼び出します。

    @Override
    public int delete(tutorial.entity.Employee employee) {
        entering("tutorial.dao.EmployeeDaoImpl", "delete", employee);
        tutorial.dao.EmployeeDaoDelegate delegate = new tutorial.dao.EmployeeDaoDelegate(config, this);
        int __result = delegate.delete(employee);
        exiting("tutorial.dao.EmployeeDaoImpl", "delete", __result);
        return __result;
    }

EmployeeDaoDelegateクラスはこう定義しておきます。何をやっているかというと、deleteメソッドが呼ばれたら削除フラグをセットして、Daoのupateメソッドを呼び返しているのです。

public class EmployeeDaoDelegate {

    protected final Config config;

    protected final EmployeeDao dao;

    public EmployeeDaoDelegate(Config config, EmployeeDao dao) {
        this.config = config;
        this.dao = dao;
    }

    public int delete(Employee employee) {
        employee.setDeleted(true);    // 削除フラグをセット
        return dao.update(employee);  
    }
}

これでDaoを利用するクラスは、論理的に削除されるのか物理的に削除されるのか意識することなくdeleteを実行できます。