1

Hibernate でエンティティとして使用しようとしている JAXB を介して生成されたクラスがあります。Java BigIntegers として定義されている数値フィールドがあります。DB2のように列を定義しても、Hibernateは次のようなバリエーションで文句を言います:

間違った列タイプ .... 列 MY_COLUMN 検出: 10 進数、予想: 数値 (19,2)。

DB2 の bigint や数値 (19,2) などを試しました。

Hibernate に方言を選択させています。DB2 の方言を選択しています。DB2 で列を定義して、Hibernate で列を使用して Java BigInteger を格納できるようにするにはどうすればよいですか?

Hibernate では big_integer として定義し、DB2 では bigint として定義すると、次のようになります。

間違った列タイプ .... 列 MY_COLUMN が検出されました: bigint、予想: numeric(19,2)

アップデート

そこで、hibernate.hbm2ddl.auto を validate から create に変更し、Hibernate にスキーマ自体を作成させました。ログから、numeric(19,2) の定義を使用して create table ステートメントを生成していることがわかりました。DB2 では、テーブルが作成されると、定義は decimal(19,2) でした。アプリは正常に起動しました。

次に、アプリをシャットダウンし、hibernate.hbm2ddl.auto の設定を再コンパイルして検証し、再起動しました。

Hibernate でエラーが発生しました: Found: decimal、expected: numeric(19,2)

では、Hibernate は自身で作成したばかりのスキーマを検証できないのでしょうか?

4

1 に答える 1

1

Hibernate スキーマの作成、更新、および検証は、存在してはならない逸脱です。これらの 3 つの機能にはすべて多くのバグがあり、いくつかの状況で失敗することが知られているため、できる限り回避するようにしてください (データベース開発者を専門とする人がいるのもそのためです)。

大きな整数を格納する方法については、列が DB2 bigint の場合、long にマップできます (どちらも 64 ビットです)。

64 ビット以上が必要な場合、列は数値である必要があり、2^81-1 までの整数を使用できます。Hibernate はこれを BigDecimal または BigInteger に自動的にマップします。

さらに大きな数値 (BigInteger がサポートする) を格納する必要がある場合は、数値を varchar に書き込む独自のカスタム型を作成する必要があります。

補足として、他のシステムとの通信に使用するオブジェクト (xml オブジェクト) と、永続化に使用するオブジェクト (両方とも異なるドメイン) を混在させることは、非常に非常に悪い習慣です。そして、あなたのドメインの一部として同じオブジェクトを使用している可能性もあると感じています。これは悪いことであり、悪であり、一部の国では犯罪です:)。

于 2012-11-12T21:31:31.637 に答える