SQLファイルを使った場合でも楽観的排他制御

次のバージョン(Doma 1.7.0)からSQLファイルを使った場合でも楽観的排他制御を行うようにします。
主に、論理削除のことを考慮してです。


たとえば、次のエンティティとDaoがあるとします。

エンティティ
@Entity 
class Employee {

   ...

   @Version
   public int version;

}
Dao
@Dao(config = AppConfig.class)
class EmployeeDao {
   // 論理削除用メソッド
    @Update(sqlFile = true)
    int delete(Employee e);
}

論理削除用のdeleteメソッドに対するSQLファイルは次のように書いておきます。

SQLファイル(delete.sql
update EMPLOYEE set DELETE_FLAG = true, VERSION = /* e.version */1 + 1 where ID = /* e.id */1 and VERSION = /* e.version */1

ポイントはバージョンをWHERE節に含め、SET節でインクリメントしていることです。
こうしておくことで、更新が衝突した場合に更新件数が0件となり、結果OptimisticLockExceptionがスローされます。


これまで同様SQLファイルを使うときには楽観的排他制御は不要という場合は、ignoreVersionにtrueを設定してください(そもそもパラメータがエンティティでなかったり、エンティティがバージョンを持たない場合はこの設定は不要です)。

@Dao(config = AppConfig.class)
class EmployeeDao {
   @Update(sqlFile = true, ignoreVersion= true)
   int delete(Employee e);
}

これで、SQLファイルを使う場合に呼び出し側のコードに変更を加える必要性が減りました(SQL自動生成系のメソッドを呼ぶ場合と変わらないということです)。


SNAPSHOTおいておきます。
http://maven.seasar.org/maven2-snapshot/org/seasar/doma/doma/1.7.0-SNAPSHOT/doma-1.7.0-20100601.170356-6.jar