一尘不染

Hibernate-自定义方言的BigDecimal列映射

hibernate

我将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!

在我正在使用的自定义方言类中,我尝试覆盖以下列类型:

        registerColumnType( Types.DECIMAL, "numeric($p,$s)" );
        registerColumnType( Types.DOUBLE, "numeric($p,$s)" );
        registerColumnType( Types.NUMERIC, "numeric($p,$s)" );

但它仍然只返回(四舍五入的)整数。

这在应用程序中的其他地方起作用,我们使用Postgres方言从Postgres检索对象。

任何想法我应该在方言中做什么,以便我可以让Hibernate正确设置检索到的BigDecimal的精度/小数位数?


阅读 414

收藏
2020-06-20

共1个答案

一尘不染

好的,在下载了Hibernate源代码并在NetBeans中使用调试器逐步调试它们之后,我发现问题出在专有JDBC驱动程序的ResultSet子类中,而不是Hibernate中。

getBigDecimal方法始终返回小数位数为0的值。

当我联系JDBC驱动程序的开发人员时,他发现了该错误并进行了修复。

2020-06-20