我们将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.