[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 メーリングリストの案内