我使用 Hibernate 作为我们的对象-关系映射,为一个晦涩的数据库使用自定义方言。
我从这个数据库中检索的实体有一个列:
@Column(name = "GROSS_WEIGHT", precision = 9, scale = 3)
private BigDecimal grossWeight;
数据库将此列定义为数字,精度为 9,小数位数为 3。
我可以看到 Hibernate 生成的用于检索数据的 SQL,当我使用数据库查询工具执行相同的查询时,它会为 GROSS_WEIGHT 列返回“9.68”。
但是,在 Hibernate 检索的实体中,“grossWeight”字段包含值“10”,scale
为 0,precision
为 2!
在我使用的自定义方言类中,我尝试覆盖以下列类型:
registerColumnType( Types.DECIMAL, "numeric($p,$s)" );
registerColumnType( Types.DOUBLE, "numeric($p,$s)" );
registerColumnType( Types.NUMERIC, "numeric($p,$s)" );
但它仍然只返回(四舍五入的)整数。
这在我们使用 Postgres 方言从 Postgres 检索对象的应用程序的其他地方起作用。
知道我应该在方言中做什么,以便让 Hibernate 正确设置检索到的 BigDecimal 的精度/小数位数吗?
最佳答案
好吧,在下载 Hibernate 源代码并使用 NetBeans 中的调试器单步执行它们之后,我发现问题出在专有 JDBC 驱动程序的 ResultSet
子类中,而不是在 Hibernate 中。
getBigDecimal
方法总是返回一个小数位数为 0 的值。
当我联系 JDBC 驱动程序的开发人员时,他发现了这个错误并修复了它。
关于java - Hibernate - 自定义方言的 BigDecimal 列映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21568693/