H2 DatabaseのIDENTITYは8バイトだけど、PostgreSQLのSERIALは4バイト。
なので、JiemamyでDialectをH2からPostgreSQLに変えると、8バイト整数であるPostgreSQLのBIGSERIALになる。
ところで、主キーであるIDENTITY or BIGSERIALに対応する別テーブルにある外部キーは精度落ちるけど4バイトのINTでも書けるのでそう書いておいて、S2JDBC-GenでEntityを生成します。そうすると、主キーの部分はjava.lang.Longで生成され、外部キーの部分はjava.lang.Integerで生成されます。
そして、ActionやServiceでtable2.table1_id = table1.id なんてことをしようとするとIntegerにLongを代入することになるのでエラーとなってしまう。
そんなわけで、H2 Databaseで開発して本番がPostgreSQLで同じJiemamyのER ダイアグラムを使うには、外部キーも全部BIGINTにしとかないと面倒なことが起きてしまう。
H2 DatabaseのIDENTITYの持つ精度のことを考えれば当然なんだけど、テーブル定義にBIGINTがたくさんあると見慣れてないせいか変な感じする。でも、H2 DatabaseとMySQLで開発しようとするとどうなるかというとH2 DatabaseのIDENTITYは4バイトのSERIALではなくBIGINTになってしまいそもそもの自動採番がなくなってしまい結局そのままでは対応できない。
とりあえずPostgreSQLとMySQLのSERIALに対応する4バイト版のIDENTITYがH2 Databaseにあれば良いのかもしれない。
というわけで、O/RマッパーがDBの方言解釈してくれても、複数DBをいったりきたりして開発するのは意外と面倒なのかもしれない。。
コメント:2
-
koichik 2008-10-04 (土) 18:00
-
> H2 DatabaseのIDENTITYは8バイト
ID IDENTITY
だと 8 バイト整数だけど,
ID INT IDENTITY
って書くと 4 バイト整数になるらしい.
前者の IDENTITY はデータ型,後者の IDENTITY は修飾子 (?) みたいな. -
jfut 2008-10-04 (土) 22:06
-
いつもありがとうございます。
ID INT IDENTITYなんて書けたんですね、明日から使うアプリなので次回作る際は使ってみたいと思います。
トラックバック:0
- このエントリーのトラックバックURL
- http://jfut.integ.jp/2008/10/07/%e7%95%b0%e3%81%aa%e3%82%8bdb%e3%82%b5%e3%83%bc%e3%83%90%e3%82%92%e3%81%84%e3%81%a3%e3%81%9f%e3%82%8a%e3%81%8d%e3%81%9f%e3%82%8a%e3%81%97%e3%81%a6%e9%96%8b%e7%99%ba%e3%81%99%e3%82%8b%e6%99%82%e3%81%ae/trackback/
- Listed below are links to weblogs that reference
- 異なるDBサーバをいったりきたりして開発する時の型に迷う from ふたつの川うるおう日記






