JPA自动转换的BigDecimal(JPA automatic BigDecimal conver

2019-09-21 02:17发布

我们正在生成我们的JPA接入层,MyEclipse的。 后来我们有生成的模型和数据层的接入服务。 我们遇到了以限定的精度某些领域的一些问题。

实体:

@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);

我们得到以下错误:com.ibm.db2.jcc.c.SqlException:所致[IBM] [DB2] [JCC] [T4] BigDecimal的转换过程中出现[1037] [11190]例外。 详情请参阅所附的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的手动precicsion到数据库中的一个。

但是如果数据模型的变化,我们必须有手动调整规模。 有没有办法让我们的JPA / Hibernate实现自动做转换我们呢? 例如,用设置属性。 在其中一个是创建豆现货否则那将是错误的地点做反正。

Answer 1:

你可以使用自定义的用户类型,或者你可以简单地实现这样的setter方法:

public void setDecTest(BigDecimal decTest) {
    this.decTest = decTest.setScale(3, RoundingMode.HALF_UP));
}

此舍入将因此在实体进行封装。

需要注意的是使用双初始化一个BigDecimal是有点怪。 如果你想1.2存储在BigDecimal的,使用new BigDecimal("1.2")你不会有初始化一个BigDecimal 1.1999999999999999555910790149937383830547332763671875



文章来源: JPA automatic BigDecimal conversion