java - JPA自动BigDecimal转换

标签 java hibernate jpa db2 bigdecimal

我们正在使用 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 的地方做这件事是错误的。

最佳答案

您可以使用自定义用户类型,或者您可以像这样简单地实现属性的 setter :

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

因此,此舍入将封装在实体中。

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

关于java - JPA自动BigDecimal转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11898855/

相关文章:

java - Eclipse 中的类型未定义该方法

java - 将类作为 JApplet 或 JFrame 运行?

java - Android 的 SQLiteOpenHelper 测试类

Java Hibernate 为什么namedQuery上的executeUpdate首先执行全表更新?

java - JPA、 hibernate 、Java。复合主键,其中之一也是外键

java - JPQL:将 varchar 转换为数字

java - 尝试使用已编译的 JavaFX 应用程序运行 Webdriver

java - 使用 Hibernate 时 @Immutable 和 @Entity(mutable=false) 有什么区别

java - 在 Hibernate 实体中使主键与外键相同

java - JPA。 Eclipselink 没有为 mySQL 提供密码,而它应该提供密码