[DAO-48] [seasar-s2dao-dev:40] 更新したプロパティのみをUPDATE文に含める Created: 2006-11-24  Updated: 2007-01-18  Resolved: 2007-01-05

Status: Resolved
Project: S2Dao
Component/s: s2dao
Affects Version/s: None
Fix Version/s: 1.0.40

Type: New Feature Priority: Major
Reporter: manhole Assignee: manhole
Resolution: Fixed Votes: 0
Labels: None


 Description   

http://ml.seasar.org/archives/seasar-s2dao-dev/2006-November/000039.html


更新したいカラムのみをUPDATE文に含める機能としてUnlessNullが
ありますが、
1. SELECTしてEntityを取得
2. Entityの1プロパティを更新
3. UPDATE
という操作をすると、結局全カラムがUPDATE文に含まれてしまいます。
更新したくないプロパティへnullをセットすればUnlessNullが機能するのですが、nullをセットするのがちょっと煩雑だと思いました。

というわけで、UPDATE文に更新プロパティのみを含める機能を提案します。

と言いつつ実は手元では動いています。(コードは汚いですが...)
EntityのsetterへAspectを仕掛けて更新したプロパティを記録することで、機能を実現しています。

例えば次の操作を行うと、

final Emp emp = empDao.findById(7499);
emp.setJob("MANAGER");
empDao.updateModifiedOnly(emp);

次のようなUPDATE文が発行されます。

UPDATE EMP SET
    tstamp = '2006-11-24 09.18.29'
   ,job = 'MANAGER'
  WHERE empno = 7499
    AND tstamp = '2000-01-01 00.00.00'

どうでしょうか? よろしくお願いします。



 Comments   
Comment by higa [ 2007-01-18 ]

+1

Comment by manhole [ 2007-01-18 ]

> Daoのupdate系メソッドの戻りがintの場合は更新行数を返すというのが現行の仕様ですが、
> (a)や(c)でUPDATEを発行しなかった場合(プロパティが変更されなかった場合)は
> -1を返すかにしようと思うのですが、どうでしょうか。

と書いたのですが、更新件数0件なので0を返すようにしようと考えを変えました。

(UPDATE文が発行され && 更新件数が0件)の場合は例外となるため、
UPDATE文が発行されない場合と見分けることが可能ですし。

Comment by manhole [ 2007-01-18 ]

Anonymousさんもコメントありがとうございます、(c)案で良さそうですね。

> ちなみに、UPDATEを行わない場合、ログはどのようになるのでしょうか?

すみません、ログは考えていなかったのですが、SQL文をDEBUG出力しているようなモノのことでしょうか?
例えば「更新プロパティが無いためUPDATE文を発行しません。table=xxx, key=yyy」といったDEBUG出力があると、どうでしょうか?

Comment by Anonymous [ 2007-01-17 ]

上のコメントした者です。
ちなみに、UPDATEを行わない場合、ログはどのようになるのでしょうか?
(a)でもDaoのUpdateメソッドが呼ばれたことはわかるといいかなと思うのですが。。。

Comment by Anonymous [ 2007-01-17 ]

(c)に+1します。
で、TIMESTAMPとかが無い場合は(a)になる、というのが一番自然な気がします。

Comment by manhole [ 2007-01-17 ]

>ひがさん

> versionNoやtimestampは最新の値にupdateするという意味ですよね。

はい。

verisonNoやtimestampが無い場合は、(a)と(c)は同じ動きになるかと。

Daoのupdate系メソッドの戻りがintの場合は更新行数を返すというのが現行の仕様ですが、
(a)や(c)でUPDATEを発行しなかった場合(プロパティが変更されなかった場合)は
-1を返すかにしようと思うのですが、どうでしょうか。

Comment by higa [ 2007-01-17 ]

Cに+1。
versionNoやtimestampは最新の値にupdateするという意味ですよね。

Comment by manhole [ 2007-01-17 ]

UPDATEする際に、1つもプロパティが変更されていない場合はどういう動作が望ましいでしょうか?

ぱっと思いつくトコロでは...

(a) UPDATE文を発行しない
(b) 例外にする
(c) TIMESTAMPやVERSIONNOを持っている場合は、そのカラムだけをUPDATEする。

のいずれかかなと思います。
(個人的にはc案に+1)

Comment by manhole [ 2007-01-17 ]

setterが呼ばれても、実際のプロパティ値が同じ場合は変更されたと見なさない(UPDATE文に含めない)ようにしました。
(revision 708)

Comment by manhole [ 2007-01-17 ]

setterが呼ばれても、実際のプロパティ値が同じ場合は変更されたと見なさない(UPDATE文に含めない)ようにしようと思います。

Comment by jflute [ 2006-12-12 ]

Entityに ModifiedProperties が定義されていない場合の例外が
TODOで暫定のIllegalStateExceptionになっていたのを
専用の例外をthrowするようにしました。その単体テストも追加しました。

Comment by manhole [ 2006-11-24 ]

動作するコードと、とても簡単なテストはコミットしました。
(Revision 656)

Generated at Mon Dec 15 10:35:17 JST 2025 using Jira 10.6.1#10060001-sha1:a6461e220f274b29ced7ac9295492f2465fe5ef5.