Interstage Application Server J2EE ユーザーズガイド |
目次
索引
![]() ![]() |
第3部 EJB編 | > 第12章 Entity Beanの実装 | > 12.11 CMPで定義するJavaのデータ型とDBMSのSQLデータ型との対応 |
以下に、使用できる標準データ型を示します。
(注)
コンテナが、対応するJavaのプリミティブデータ型に変換してからデータベースに設定します。
以下に、nullが使用できるデータ型を示します。
以下に、Javaのデータ型とDBMSのSQLデータ型の組合せ(推奨パターン)を示します。
Javaのデータ型を、以下の表に示す以外のDBMSのSQLデータ型と組み合わせたい場合は、JDBCドライバの変換規則に従ってください。
ただし、“使用できる標準データ型”で、(注)となっているデータ型については、コンテナが変換した後のJavaのプリミティブデータ型でJDBCの変換規則に従ってください。
なお、Interstage EJBではJDBC2.0の範囲でサポートしています。
DBMSがOracleで、CHAR型のカラムを使用すると、OracleのJDBCドライバによって、返却される文字列の後ろに続く空白(スペース)を削除する、または文字列長さを合わせるパディングを行うため、データの不整合が起こる可能性があります。
特にプライマリキーフィールドにCHAR型のカラムをマッピングする場合に注意が必要です。
CHAR型を使用する代わりにVARCHAR2型を使用することで、この問題は解決されます。
Javaのデータ型 |
DBMSのSQLデータ型 |
||
Symfoware |
Oracle |
SQL Server |
|
boolean/java.lang.Boolean |
− |
NUMBER |
− |
byte/java.lang.Byte (注1) |
− |
NUMBER |
− |
char/java.lang.Character |
− |
− |
− |
double/java.lang.Double |
FLOAT |
NUMBER |
float |
float/java.lang.Float |
REAL |
NUMBER |
real |
int/java.lang.Integer |
INT |
NUMBER |
int |
long/java.lang.Long |
− |
NUMBER |
− |
short/java.lang.Short (注1) |
SMALLINT |
NUMBER |
smallint |
java.lang.String |
CHAR |
CHAR (注3) |
char |
java.math.BigDecimal |
NUMERIC |
NUMBER |
decimal |
byte[] |
BLOB (注2) |
RAW |
binary |
java.sql.Date |
DATE |
DATE |
− |
java.sql.Time |
TIME |
DATE |
− |
java.sql.Timestamp |
TIMESTAMP |
DATE |
datetime (注5)(注6) |
− : 推奨するデータ型は特にありません。
(注1)
CMFのJavaのデータ型が“byte/java.lang.Byte”または“short/java.lang.Short”の場合で、Oracle8iのJDBCドライバを使用してCMP2.0のメソッドを実行すると、“列の型が無効です。”というエラーが発生する場合があります
この場合、CMFのJavaのデータ型を“int/java.lang.Integer”または“long/java.lang.Long”に変更してください。
(注2)
以下の場合、32KB以上のBLOB型の列に対して取出し/設定はできません。
(注3)
Oracleの以下のデータ型は取り扱い可能なデータ量に制限があります。
上記制限値より大きいデータ量を取り扱う場合はBMPのEntity Beanを使用してください
(注4)
OracleのLONGRAWデータ型を使用する場合、CMPのEntity Beanのトランザクション属性にMandatoryを指定して動作させるとOracleのJDBCドライバより以下のメッセージが出力される場合があります。
「ORA-17027:ストリームはすでにクローズ済みです」
トランザクション属性にRequiredを指定することで上記問題は回避できますが、処理性能が劣化する場合があります。
(注5)
datetime型とsmalldatetime型のデータを更新する場合は、以下の形式でデータを指定してください。
YYYY-MM-DD hh:mm:ss |
YYYY:年、MM:月、DD:日、hh:時、mm:分、ss:秒
(ミリ秒は未サポートです。)
2001-09-22 14:23:40
(注6)
datetime型に対して、以下のAPIを使用する場合、smalldatetime型の範囲内の値だけ有効となります。
Javaのデータ型 |
DBMSのSQLデータ型 |
|
Symfoware |
Oracle |
|
boolean/java.lang.Boolean |
− |
NUMBER |
byte/java.lang.Byte (注1) |
− |
NUMBER |
char/java.lang.Character |
− |
− |
double/java.lang.Double |
FLOAT |
NUMBER |
float/java.lang.Float |
REAL |
NUMBER |
int/java.lang.Integer |
INT |
NUMBER |
long/java.lang.Long |
− |
NUMBER |
short/java.lang.Short (注1) |
SMALLINT |
NUMBER |
java.lang.String |
CHAR |
CHAR (注3) |
java.math.BigDecimal |
NUMERIC |
NUMBER |
byte[] |
BLOB (注2) |
RAW |
java.sql.Date |
DATE |
DATE |
java.sql.Time |
TIME |
DATE |
java.sql.Timestamp |
TIMESTAMP |
DATE |
− : 推奨するデータ型は特にありません。
(注1)
CMFのJavaのデータ型が“byte/java.lang.Byte”または“short/java.lang.Short”の場合で、Oracle8iのJDBCドライバを使用してCMP2.0のメソッドを実行すると、“列の型が無効です。”というエラーが発生する場合があります
この場合、CMFのJavaのデータ型を“int/java.lang.Integer”または“long/java.lang.Long”に変更してください。
(注2)
以下の場合、32KB以上のBLOB型の列に対して取出し/設定はできません。
(注3)
Oracleの以下のデータ型は取り扱い可能なデータ量に制限があります。
上記制限値より大きいデータ量を取り扱う場合はBMPのEntity Beanを使用してください
(注4)
OracleのLONGRAWデータ型を使用する場合、CMPのEntity Beanのトランザクション属性にMandatoryを指定して動作させるとOracleのJDBCドライバより以下のメッセージが出力される場合があります。
「ORA-17027:ストリームはすでにクローズ済みです」
トランザクション属性にRequiredを指定することで上記問題は回避できますが、処理性能が劣化する場合があります。
Javaのデータ型 |
DBMSのSQLデータ型 |
||
Symfoware |
Oracle |
PostgreSQL |
|
boolean/java.lang.Boolean |
− |
NUMBER |
BOOLEAN |
byte/java.lang.Byte |
− |
NUMBER |
SMALLINT |
char/java.lang.Character |
− |
− |
− |
double/java.lang.Double |
FLOAT |
NUMBER |
DOUBLE PRECISION (注4) |
float/java.lang.Float |
REAL |
NUMBER |
REAL (注4) |
int |
INT |
NUMBER |
INTEGER |
java.lang.Integer |
INT |
NUMBER |
INTEGER |
long |
− |
NUMBER |
BIGINT |
java.lang.Long |
− |
NUMBER |
BIGINT |
short/java.lang.Short |
SMALLINT |
NUMBER |
SMALLINT |
java.lang.String |
CHAR |
CHAR (注2) |
CHARACTER |
java.math.BigDecimal |
NUMERIC |
NUMBER |
NUMERIC |
byte[] |
BLOB (注1) |
RAW |
BYTEA |
java.sql.Date |
DATE |
DATE |
DATE |
java.sql.Time |
TIME |
DATE |
TIME |
java.sql.Timestamp |
TIMESTAMP |
DATE |
TIMESTAMP |
− : 推奨するデータ型は特にありません。
(注1)
以下の場合、32KB以上のBLOB型の列に対して取出し/設定はできません。
(注2)
Oracleの以下のデータ型は取り扱い可能なデータ量に制限があります。
上記制限値より大きいデータ量を取り扱う場合はBMPのEntity Beanを使用してください
(注3)
OracleのLONGRAWデータ型を使用する場合、CMPのEntity Beanのトランザクション属性にMandatoryを指定して動作させるとOracleのJDBCドライバより以下のメッセージが出力される場合があります。
「ORA-17027:ストリームはすでにクローズ済みです」
トランザクション属性にRequiredを指定することで上記問題は回避できますが、処理性能が劣化する場合があります。
(注4)
PostgreSQLのREALデータ型とDOUBLE PRECISIONデータ型は不正確な精度が変動する数値データ型です。したがって、正確な値ではなく、正確な値に近い値として保存されることがあるため、保存しようとする値と保存された値に多少の誤差がある可能性があります。
なお、ゼロに限りなく近い値で、ゼロとは区別されていない数値は、アンダーフローエラーを引き起こします。正確な記録や計算が必要な場合は、NUMERICデータ型を使用してください。
目次
索引
![]() ![]() |