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

标签 java database hibernate jpa h2

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

字段定义如下所示

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

所以 1.456 被截断为 1.46。

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

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

最佳答案

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

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

我通过使用调试器单步执行 Hibernate 源代码发现了这一点,同时试图找到 my own question 的答案。 .

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

另见 my question here还有这个other question .

关于java - 使用 Hibernate 将 BigDecimal 存储到 H2 时丢失精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16289804/

相关文章:

mysql - 嵌套案例语句逻辑

java - 更改小时、分钟和秒

ant - 将java库包含到自己的库中

SQL 查询选择基于同一表中其他行的某些值的行

mysql - WordPress 数据库

java - 如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段

java - 如何访问 HQL 中的枚举属性?

java.lang.IllegalStateException : Timer already cancelled when webapp redeploys on tomcat 错误

java - 具有相同字符串值的两个不同变量引用相同的内存地址

java - 将对象转换为字符串时出错