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

我们将H2数据库用于测试目的,但是当我使用Hibernate将BigDecimal值存储到该数据库中,然后将其加载回时,该值将被截断为两位小数位:

字段定义如下所示

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

因此1.456被截断为1.46.

我不知道预先的精度(每个实体都不同),所以我无法在注释中定义它们.

有什么办法可以解决这个问题?

解决方法:

即使您不预先知道精度/小数位数,我认为您仍然需要在@Column批注中定义最大精度和小数位数.您需要查看生成的数据库架构,以了解Hibernate如何定义该列.

顺便说一句,我可以告诉您,从数据库返回的BigDecimal值的创建是通过专有JDBC驱动程序对数据库特定ResultSet子类的getBigDecimal方法的实现来完成的.

我通过尝试使用调试器逐步进入Hibernate源代码,而试图找到my own question的答案时发现了这一点.

似乎getBigDecimal方法的某些实现将使用数据库模式中定义的精度/小数位数,或者将尝试通过仅定义保持所检索值所需的最小精度/小数位数来优化返回的BigDecimal.

另请参见my question here和此other question.

上一篇:java-减少H2上的线程争用


下一篇:H2 7-8 按正整数的相反数字顺序输出