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