我们正在使用 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);
我们得到以下错误: Caused by: com.ibm.db2.jcc.c.SqlException: [ibm][db2][jcc][t4][1037][11190] BigDecimal 转换期间发生异常。详见附件 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 的地方做这件事无论如何都是错误的。