我将Hibernate用作我们的对象关系映射,并为晦涩的数据库使用了自定义方言。
我从该数据库中检索的实体具有一列,因此:
@Column(name = "GROSS_WEIGHT", precision = 9, scale = 3) private BigDecimal grossWeight;
数据库将此列定义为数字,精度为9,小数位数为3。
我可以看到Hibernate生成的用于检索数据的SQL,当我使用数据库查询工具执行相同的查询时,它为GROSS_WEIGHT列返回“ 9.68”。
但是,在由Hibernate检索的Entity中,“ grossWeight”字段包含值“ 10”,a scale的值为0和precision2!
scale
precision
在我正在使用的自定义方言类中,我尝试覆盖以下列类型:
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中。
ResultSet
该getBigDecimal方法始终返回小数位数为0的值。
getBigDecimal
当我联系JDBC驱动程序的开发人员时,他发现了该错误并进行了修复。