【问题标题】:Hibernate - BigDecimal column mapping for Custom DialectHibernate - 自定义方言的 BigDecimal 列映射
【发布时间】:2014-02-05 04:31:41
【问题描述】:

我使用 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 的精度/比例吗?

【问题讨论】:

    标签: java hibernate jpa hibernate-mapping bigdecimal


    【解决方案1】:

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

    getBigDecimal 方法总是返回一个比例为 0 的值。

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

    【讨论】:

    • 什么数据库,什么 JDBC 驱动程序/版本?
    • “数据库”实际上是一个名为“Genesis”的专有 RDBMS 引擎,位于 Acucobol(现为 MicroFocus)Vision 索引文件之上。驱动程序被称为“漩涡”。驱动程序和引擎均由Trifox Inc 编写,但由MicroFocus 销售/分发
    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2012-08-22
    • 2021-10-30
    相关资源
    最近更新 更多