[Seasar-user:2643] Re: 更新SQL自動生成について

J.r0ck j69
2005年 10月 2日 (日) 10:43:01 JST


J.r0ckです。

> う〜ん、思い切ってDB側でIDの後ろスペース取れないかしら(笑)
> これから、犬の散歩なので続きは後ほど...。
以下は、あくまで自分の意見でして、こうあるべきだという
答えを書いているわけではありませんので...そこのとこ
よろしくお願いします。

1.S2JDBCでは、以下のJDBCタイプを、JavaのStringとして
  いる。
   Types.CHAR
   Types.LONGVARCHAR
   Types.VARCHAR

これについて、S2はOracleに特化したものではないので
正しい仕様なんだと自分は思います。

DB2のCHAR型を例に挙げても、OracleのCHAR型とは振舞いが
異なるようなので...。
# DB2触ったことないので、自分で確かめてはいませんが(汗)

2.システム固有の仕様
> TABLE(HOGE)
> -----------------------------
> ID  char(4)   主キー
> NAME varchar2(10)
> ------------------------------
...
> このようなプログラムがあった場合、dao#updateで自動生成されるSQLは
> 
> update HOGE set ID='4', NAME='TEST' where ID='4'
> 
> のような感じになります。
> この時WHERE句は ID='4   'ではなくID='4'となっている為、一致するデータは
> 0件となります
ということなので、IDには、'4   'が入っていると想像できるんですが
これは、システム固有の仕様になるのではないのかと。
・レガシーシステムからの移行データ
・レガシーシステムとのデータのやり取りが常に発生している
など、いろいろと理由があるかも知れません。

と、1.2.を鑑みると、'4'の後ろが空白で埋まっているか否かは、
仕様を知っている人にしかわからないことなので、やはり業務ロジック側が
対応する内容と自分なら考えます。

> とりあえず応急処置としてプログラムでBeanに値をセットする際に指定文字分だ
> け後ろに半角スペースを埋めて一致させるようにしていますが、テーブルの桁数
> が増減した場合にプログラムを修正する事になってしまうので、できれば裂けた
> いと思っています
> また、SQLファイルを用意してSETを全部書いてしまうのも一つの手段とは思いま
> すが、フィールドが多いので、できればその方法も避けたいと思っています。
確かに悩ましいですね。
でも、せっかくS2使ってるので、AOPを利用して
org.seasar.extension.jdbc.types.ValueTypes#getValueType
をポイントカットし、Types.CHARの場合だけ自分流ってことも
考えられるかも知れないですね。
# S2の使い方として正しいかどうかは別として(汗)

以上

-- 
J.r0ck <[E-MAIL ADDRESS DELETED]>




Seasar-user メーリングリストの案内