現在比較中(補足)

現在比較中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の状態は不要だったりもします。