JPA自动BigDecimal转换

Udo*_*eld 3 java db2 hibernate jpa bigdecimal

我们用MyEclipse生成jpa访问层.之后我们将生成模型和数据层访问服务.我们遇到了一些具有定义精度的字段的问题.

实体:

@Entity
public class TestEntity{
   @Column(name="DECTEST", scale = 3, precision = 13)
   BigDecimal decTest;

}
Run Code Online (Sandbox Code Playgroud)

现在我们创建一个bean并尝试保存它:

TestEntity te = new TestEntity();
te.setDecTest(new BigDecimal(1.2));

TestEntityService.save(te);
Run Code Online (Sandbox Code Playgroud)

我们收到以下错误:引起: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
Run Code Online (Sandbox Code Playgroud)

问题似乎是我们的BigDecimals规模高于数据库中的规模.

一个有效的解决方法是:

TestEntity te = new TestEntity();

BigDecimal decTest = new BigDecimal(1.2);

te.setDecTest(decTest.setScale(3,RoundingMode.HALF_UP);

TestEntityService.save(te);
Run Code Online (Sandbox Code Playgroud)

通过此解决方法,我们将BigDecimals precicsion手动减少到数据库之一.

但是,如果数据模型发生变化,我们必须手动调整比例.有没有办法让我们的jpa/hibernate实现自动为我们进行转换?例如设置一个属性.无论如何,在创建bean的地方进行此操作将是错误的.

JB *_*zet 7

您可以使用自定义用户类型,或者您可以简单地实现属性的setter,如下所示:

public void setDecTest(BigDecimal decTest) {
    this.decTest = decTest.setScale(3, RoundingMode.HALF_UP));
}
Run Code Online (Sandbox Code Playgroud)

因此,这种舍入将封装在实体中.

请注意,使用double来初始化BigDecimal有点奇怪.如果要1.2存储在BigDecimal中,请使用new BigDecimal("1.2"),并且不会使用初始化的BigDecimal 1.1999999999999999555910790149937383830547332763671875.