java 使用Hibernate将BigDecimal存储到H2时丢失精度

fafcakar  于 2023-02-28  发布在  Java
关注(0)|答案(3)|浏览(209)

我们使用H2数据库进行测试,但是当我使用Hibernate将BigDecimal值存储到其中,然后再将其加载回来时,该值被截断为两位小数:
字段定义如下所示

@Column(name = "Rate", nullable = true)
private BigDecimal rate;

所以1.456被截断为1.46。
我不知道前面的精度(每个实体的精度都不同),所以我不能在注解中定义它们。
有什么办法可以解决这个问题吗?

m528fe3b

m528fe3b1#

即使您不知道前面的精度/小数位数,我认为您仍然需要在@Column注解中定义 maximum 精度和小数位数,您需要查看生成的数据库模式,以了解Hibernate是如何定义列的。
顺便说一句,我可以告诉您,从数据库返回的BigDecimal值的创建是由专用JDBC驱动程序实现的数据库特定ResultSet子类的getBigDecimal方法完成的。
我是在尝试找到my own question的答案时,通过调试器单步调试Hibernate源代码发现这一点的。
getBigDecimal方法的一些实现似乎要么使用数据库模式中定义的精度/小数位数,要么试图通过只定义保存检索值所需的最小精度/小数位数来优化返回的BigDecimal
另请参见my question here和此other question

y53ybaqx

y53ybaqx2#

我们遇到了一个与这里描述的非常相似的情况,但是问题部分是由于我们管理环境的方式,我们使用Spring Data JPA(使用Hibernate),但是使用Flyway管理模式迁移。
当与Postgres交互时,一切正常,但当使用H2进行测试时,我们所有的DECIMAL类型都被持久化到数据库中,只有两位数的四舍五入(半上)比例,没有明显的原因。
在我们的示例中,通过在 Boot www.example.com中设置此标志解决了问题application.properties:
spring.jpa.hibernate.ddl-auto=none
因此,根本原因是Hibernate应用的DDL生成的JPA定义不完整。我们的解决方案是禁用自动DDL生成,因为我们使用SQL脚本来处理它,但这也应该可以通过更完整的JPA定义来修复。

vdgimpew

vdgimpew3#

遇到了这个,尝试存储如下值:0.08559、0.000000012将存储为0.00。必须在实体定义上使用小数位数+精度属性,例如:

@Column(scale = 15, precision = 30)
private BigDecimal myValue;

记住:精度指定数字中的总位数,小数位数指定小数点后的位数。

相关问题