Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA自动大十进制转换_Java_Hibernate_Jpa_Db2_Bigdecimal - Fatal编程技术网

Java JPA自动大十进制转换

Java JPA自动大十进制转换,java,hibernate,jpa,db2,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.setDecTe

我们正在使用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);
我们得到以下错误: 原因:com.ibm.db2.jcc.c.SqlException:[ibm][db2][jcc][t4][1037][11190]在bigdecime转换期间发生异常。有关详细信息,请参见随附的一次性广告

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
问题似乎是我们的大小数比例高于数据库中的大小数比例

解决办法是:

TestEntity te = new TestEntity();

BigDecimal decTest = new BigDecimal(1.2);

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

TestEntityService.save(te);
通过这种解决方法,我们手动将大小数精度降低到数据库的精度


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

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

public void setDecTest(BigDecimal decTest) {
    this.decTest = decTest.setScale(3, RoundingMode.HALF_UP));
}
因此,这种舍入将封装在实体中


请注意,使用double初始化BigDecimal有点奇怪。如果您想将
1.2
存储在BigDecimal中,请使用
newbigdecimal(“1.2”)
,这样您就不会使用
1.1999999999999999555910790149937383830547332763671875初始化BigDecimal,同时考虑这两个问题。然而,1.2仅用于测试。它来自用户界面,应该被验证为一个数字,这样就没有人可以发送“哈罗”,而不是一个数字。由于访问层是生成的,我不想修改它。以手动方式使用几个BigDecimal属性并不好,但是如果没有更好的方法,我们可能不得不使用它。您关于不将double解析为BigDecimal的构造函数的评论为我省去了一些麻烦。这是一个我必须拒绝的诱惑。