5

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

字段定义如下所示

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

所以 1.456 被截断为 1.46。

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

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

4

2 回答 2

5

即使您事先不知道精度/比例,我认为您仍然需要在注释中定义最大精度和比例。@Column您需要查看生成的数据库模式以了解 Hibernate 如何定义列。

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

我通过使用调试器逐步通过 Hibernate 源代码发现了这一点,同时试图找到我自己问题的答案。

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

另请参阅我的问题here和this other question

于 2014-02-07T01:51:34.753 回答
1

我们遇到了与此处描述的情况非常相似的情况,但问题的部分原因在于我们管理环境的方式。我们正在使用 Spring Data JPA(使用 Hibernate),但使用 Flyway 管理我们的模式迁移。

与 Postgres 交互时,一切都很好,但是当使用 H2 进行测试时,我们所有的 DECIMAL 类型都被持久化到数据库中,只有两位数的四舍五入(半向上),没有明显的原因。

在我们的例子中,通过在我们的 Spring Boot application.properties 中设置这个标志来解决问题:

spring.jpa.hibernate.ddl-auto=none

因此,根本原因是 Hibernate 应用的 DDL 生成的 JPA 定义不完整。我们的解决方案是禁用自动 DDL 生成,因为我们使用 SQL 脚本来处理它,但这也应该可以通过更完整的 JPA 定义来修复。

于 2015-08-19T17:37:32.747 回答