8

私はjavax.persistenceAPIとHibernateを使用して、Oracle11gExpressデータベースにアノテーションと永続エンティティおよびそれらの属性を作成しています。

エンティティに次の属性があります。

@Column(precision = 12, scale = 9)
private BigDecimal weightedScore;

目標は、小数点以下12桁まで、および小数点以下9桁までの小数点以下の値を保持することです。

を計算するweightedScoreと、結果は0.1234になりますが、Oracleデータベースでエンティティをコミットすると、値は0.12と表示されます。

これは、EntityManagerオブジェクトを使用してエントリをクエリするか、WebブラウザのOracle Application Express(Apex)インタフェースで直接表示することで確認できます。

精度が正しく維持されるように、BigDecimal属性にどのように注釈を付ける必要がありますか?

注:インメモリHSQLデータベースを使用して単体テストを実行しますが、@Columnアノテーションの有無にかかわらず、精度が不足しているという問題は発生しません。

アップデート:

テーブルの説明を見ると、weightedScore列の定義はですNUMBER(19, 2)。アノテーションもに変更してみまし@Column(columnDefinition="Number(12, 9)")たが、効果がありません。Oracleがこれらのアノテーションに応答しない理由を誰かが知っていますか?

4

2 に答える 2

6

私は答えを見つけました。ハザ!

OracleApexインタフェースを介して次のクエリを実行しようとしました。

alter table NODE modify (WEIGHTEDSCORE NUMBER(12, 9));

データを含む列を変更して精度やスケールを下げることはできないというエラーを受け取りました。これが私の問題でした!

既存のデータでテーブルを変更しようとしたため、テーブルを削除して再初期化するか、列を変更して精度とスケールを向上させる必要がありました。

私は成功して次のクエリを試みました:

alter table NODE modify (WEIGHTEDSCORE NUMBER(26, 9));

その理由は、小数点の右側に7桁の精度を追加したいので、スケールの増加を補うために全体の精度に7を追加しています。このようにして、列は、右側に精度を追加しながら、小数点の左側にある既存のすべての精度を維持できます。

于 2012-06-11T14:40:38.600 に答える
1

これに問題があるのはあなただけではないようです:http ://www.eclipse.org/forums/index.php/m/716826/

于 2012-06-09T08:52:55.503 に答える