現在比較中(補足)
現在比較中2 - mokkouyou2001の日記
現在比較中 - mokkouyou2001の日記
更新の場合を少し補足
S2JDBCの場合
Emp emp = empService.findById(2l); emp.empName = "更新太郎"; System.out.println(emp); empService.update(emp); System.out.println(emp);
以下のようなログ(と出力になる)
[Emp: id: 2 empNo: 7499 empName: ALLEN mgrId: 6 hiredate: 1981-02-20 sal: 1600.00 deptId: 3 versionNo: 1 dept: null mgr: null]
update EMP set EMP_NO = 7499, EMP_NAME = '更新太郎', MGR_ID = 6, HIREDATE = '1981-02-20', SAL = 1600.00, DEPT_ID = 3, VERSION_NO = VERSION_NO + 1 where ID = 2 and VERSION_NO = 1
[Emp: id: 2 empNo: 7499 empName: 更新太郎 mgrId: 6 hiredate: 1981-02-20 sal: 1600.00 deptId: 3 versionNo: 2 dept: null mgr: null]
差分だけで更新したいような場合、
Emp old = empService.findById(2l); System.out.println(old); Emp emp = org.seasar.framework.beans.util.Beans.createAndCopy(Emp.class, old).execute(); emp.empName = "更新太郎"; jdbcManager.update(emp).changedFrom(old).execute(); System.out.println(emp);
とすると
update EMP set EMP_NAME = '更新太郎', VERSION_NO = VERSION_NO + 1 where ID = 2 and VERSION_NO = 1
のようになります。
idとversionNoがわかっていて、更新される項目が限定されるのであれば、
excludesNullや、excludes/includesで指定することにより、findByIdから、Beans.createAndCopyではなく、
new Emp()して、値を設定して更新ということも可能です。
dbfluteの場合
Emp emp = empBhv.selectByPKValueWithDeletedCheck(2); System.out.println(emp); emp.setEmpName("更新次郎"); empBhv.update(emp); System.out.println(emp);
[Emp: _id: 2 _empNo: 7499 _empName: ALLEN _mgrId: 6 _hiredate: 1981-02-20 00:00:00.0 _sal: 1600.00 _deptId: 3 _versionNo: 1 _parentDept: null]
update EMP set EMP_NAME = '更新次郎', VERSION_NO = 2 where ID = 2 and VERSION_NO = 1
[Emp: _id: 2 _empNo: 7499 _empName: 更新次郎 _mgrId: 6 _hiredate: 1981-02-20 00:00:00.0 _sal: 1600.00 _deptId: 3 _versionNo: 2 _parentDept: null]
のように、setterが呼ばれた項目のみの更新となります。
なので、特に元のEntityの状態は不要だったりもします。