我们使用H2数据库进行测试,但是当我使用Hibernate将BigDecimal值存储到其中,然后再将其加载回来时,该值被截断为两位小数:字段定义如下所示
@Column(name = "Rate", nullable = true) private BigDecimal rate;
所以1.456被截断为1.46。我不知道前面的精度(每个实体的精度都不同),所以我不能在注解中定义它们。有什么办法可以解决这个问题吗?
m528fe3b1#
即使您不知道前面的精度/小数位数,我认为您仍然需要在@Column注解中定义 maximum 精度和小数位数,您需要查看生成的数据库模式,以了解Hibernate是如何定义列的。顺便说一句,我可以告诉您,从数据库返回的BigDecimal值的创建是由专用JDBC驱动程序实现的数据库特定ResultSet子类的getBigDecimal方法完成的。我是在尝试找到my own question的答案时,通过调试器单步调试Hibernate源代码发现这一点的。getBigDecimal方法的一些实现似乎要么使用数据库模式中定义的精度/小数位数,要么试图通过只定义保存检索值所需的最小精度/小数位数来优化返回的BigDecimal。另请参见my question here和此other question。
@Column
BigDecimal
ResultSet
getBigDecimal
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定义来修复。
spring.jpa.hibernate.ddl-auto=none
vdgimpew3#
遇到了这个,尝试存储如下值:0.08559、0.000000012将存储为0.00。必须在实体定义上使用小数位数+精度属性,例如:
@Column(scale = 15, precision = 30) private BigDecimal myValue;
记住:精度指定数字中的总位数,小数位数指定小数点后的位数。
3条答案
按热度按时间m528fe3b1#
即使您不知道前面的精度/小数位数,我认为您仍然需要在
@Column
注解中定义 maximum 精度和小数位数,您需要查看生成的数据库模式,以了解Hibernate是如何定义列的。顺便说一句,我可以告诉您,从数据库返回的
BigDecimal
值的创建是由专用JDBC驱动程序实现的数据库特定ResultSet
子类的getBigDecimal
方法完成的。我是在尝试找到my own question的答案时,通过调试器单步调试Hibernate源代码发现这一点的。
getBigDecimal
方法的一些实现似乎要么使用数据库模式中定义的精度/小数位数,要么试图通过只定义保存检索值所需的最小精度/小数位数来优化返回的BigDecimal
。另请参见my question here和此other question。
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定义来修复。
vdgimpew3#
遇到了这个,尝试存储如下值:0.08559、0.000000012将存储为0.00。必须在实体定义上使用小数位数+精度属性,例如:
记住:精度指定数字中的总位数,小数位数指定小数点后的位数。