MyEclipse を使用して jpa アクセス レイヤーを生成しています。その後、生成されたモデルとデータ層アクセス サービスを取得します。精度が定義されている一部のフィールドで問題が発生しました。
実在物:
@Entity
public class TestEntity{
@Column(name="DECTEST", scale = 3, precision = 13)
BigDecimal decTest;
}
次に、Bean を作成して保存します。
TestEntity te = new TestEntity();
te.setDecTest(new BigDecimal(1.2));
TestEntityService.save(te);
次のエラーが表示されます。詳細については、添付の Throwable を参照してください。
Caused by: com.ibm.db2.jcc.a.a: [ibm][db2][jcc][converters][608][10994] Overflow occurred during numeric data type conversion of "1.1999999999999999555910790149937383830547332763671875".
at com.ibm.db2.jcc.a.e.a(e.java:61)
at com.ibm.db2.jcc.b.jb.a(jb.java:1772)
... 73 more
問題は、BigDecimals スケールがデータベースのものよりも高いことです。
有効な回避策は次のとおりです。
TestEntity te = new TestEntity();
BigDecimal decTest = new BigDecimal(1.2);
te.setDecTest(decTest.setScale(3,RoundingMode.HALF_UP);
TestEntityService.save(te);
この回避策では、BigDecimals の精度を手動でデータベースのものに減らします。
ただし、データ モデルが変更された場合は、スケールを手動で調整する必要があります。jpa / hibernate の実装でその変換を自動的に行う方法はありますか? たとえば、プロパティを設定します。とにかく、Bean を作成している場所でそれを行うのは間違った場所です。