[Seasar-user:16345] [S2JDBC-Gen] SQL Server 2008 Express版で問題がありました

荒井祐己 [E-MAIL ADDRESS DELETED]
2008年 11月 20日 (木) 16:46:43 JST


荒井と申します。SQL Server 2008 Express版(無償で公開されているもの) で
S2JDBC-Genの検証をしておりますが、MssqlGenDialectクラス関係で、いくつか
問題(不足)があるようです。


まず、こちらの検証環境ですが、
S2JDBCのバージョンが、2.4.32
S2JDBC-Genのバージョンが、0.9.3
JDBCドライバーとして、jtds-1.2.2.jar を使用しています。


そして、こちらでみつけた問題は、現象としては、次の2つです。

1)S2JDBCのDialectはきちんと設定しているのに、S2JDBC-Genでは、明示的にタスクの
genDialectClassNameプロパティを設定しないと、MssqlGenDialectクラスではなく、
StandardGenDialectクラスが適用されてしまう。StandardGenDialectクラスが適用
されてしまうと、SQLServerがユーザとスキーマの分離、などということをやってくれ
たために、gen-entityタスクでは、どうにもエンティティが生成できないという
ことになります。

2)gen-entityタスクで生成したエンティティをみると、主キーで、autoIncrementを
設定したbigint型のカラム(Java上ではLong型として取り扱いたい)がString型で
生成されている。


こちらで、解析した問題の原因は次のとおりです。

まず、1)ですが、org.seasar.extension.jdbc.gen.dialect.GenDialectRegistryの変換
マップ(dialectMap)に、MssqlGenDialectオブジェクトが格納されていないようです。
(これは、あえて、現在は、そのようにしているのか、とも思いました。)

次に、2)の原因ですが、これは、jtds-1.2.2.jarの問題とみるべきなのかも知れません。

CREATE TABLE [dbo].[tableName](
[pkColumnName] [bigint] IDENTITY(1,1) NOT NULL,
(snip)
)

というような形で作られたカラムなのですが、jtds-1.2.2.jarのConnectionオブジェクト
から取り出されたDataBaseMetaDataに、getColumns(String, String, String, String)
メソッドを適用して返されるRecordSetにgetString("TYPE_NAME")しますと、このカラムに
ついては、"bigint"ではなく、"bigint identity" という値が返るようになってしまって
います。

従って、StandardGenDialectのgetColumnTypeメソッドでは単純に、
変換マップ(columnTypeMap)から、"bigint identity"をキーに登録されたエンティティの
プロパティの型情報を取り出そうとする動きとなってしまい、何も取得できないので、
このプロパティがString型で生成されることになります。

MssqlGenDialectクラスで、columnTypeMapに、"bigint identity"をキーに、BigIntType
オブジェクトを登録しておくようするか、あるいは、getColumnTypeメソッドを、
オーバーライドして、引数で渡されたキー値にスペースが含まれていたならば、
スペースより前の部分だけで、columnTypeMapを検索するようにすれば、問題は解決すると
思われます。(そうするべきかどうかはわかりませんが。)


上記の問題に関してですが、こちらで最小限のパッチをあてて使用していくことが可能なので
次回のリリースに含めるような形で対策していただければと思っております。
(商用版のSQLServerでは動作が違うかも知れない、というのも、気にかかっております。)


あと、1つアドバイスがあれば、御教示いただければと思うのですが、上記のような問題
解析は、とてもソースを追うだけではできず、クラスパスとシステムプロパティをセット
した後に、org.seasar.extension.jdbc.gen.command.CommandAdapter#Main(String[]) を
呼び出すようなプログラムを実行させて、Eclipse上でトレースしました。そういう形が
できてしまえば、楽に原因究明ができるようになったのですが、そこに辿りつくまでは、
どうやったら問題の所在がわかるのか迷いました。Antを-verboseオプション付きなどで
実行しても何も情報が得られなかったり、ログがどこかに出ていないか探したりという
試行錯誤の上、もはやデバッガーでトレースするしかないだろうと決心してやってみた
次第です。他に、問題究明のアプローチとして、考えられたことがあれば、是非、教えて
ください。よろしくお願いいたします。


#蛇足です。
#http://s2container.seasar.org/2.4/ja/s2jdbc_gen/tasks/gen_service.html の表の
#中で、プロパティ名が useNames となっているのは、useNamesClass の間違いだと
#思います。

==========================
 荒井 祐己
 [E-MAIL ADDRESS DELETED]
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20081120/180c2c3c/attachment-0001.html>


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