如何在 Hibernate 中映射 BigDecimal 以便获得与输入相同的比例?

发布于 2024-11-18 06:45:12 字数 562 浏览 8 评论 0原文

在 Java 中,new BigDecimal("1.0") != new BigDecimal("1.00")规模很重要

然而,对于 Hibernate/SQL Server 来说显然并非如此。如果我将 BigDecimal 的标度设置为特定值,通过 Hibernate 将 BigDecimal 保存到数据库,然后重新膨胀我的对象,我会得到一个具有不同标度的 BigDecimal。

例如,我假设值 1.00 返回为 1.000000,因为我们将 BigDecimals 映射到定义为 NUMERIC(19,6) 的列。我不能仅将列定义为所需的比例,因为我需要将美元和日元值(例如)存储在同一列中。为了便于外部报告工具使用,我们需要在数据库中将 BigDecimals 表示为数字类型。

是否存在“正确”映射 BigDecimal 的 Hibernate UserType,还是我必须编写自己的?

In Java, new BigDecimal("1.0") != new BigDecimal("1.00") i.e., scale matters.

This is apparently not true for Hibernate/SQL Server, however. If I set the scale on a BigDecimal to a particular value, save the BigDecimal to the database via Hibernate and then re-inflate my object, I get back a BigDecimal with a different scale.

For instance, a value of 1.00 is coming back as 1.000000, I assume because we're mapping BigDecimals to a column defined as NUMERIC(19,6). I can't just define the column as the required scale as I need to store both Dollar and Yen values (for example) in the same column. We need to represent the BigDecimals as numeric types in the database for the benefit of external reporting tools.

Does there exist a Hibernate UserType which maps BigDecimal "properly", or do I have to write my own?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

爱她像谁 2024-11-25 06:45:12

仅供参考,我可以告诉您,从数据库返回的 BigDecimal 的创建是通过专有 JDBC 驱动程序对数据库特定的“ResultSet”子类的“getBigDecimal”方法的实现来完成的。

我通过使用调试器单步调试 Hibernate 源代码发现了这一点,同时尝试找到我自己的答案 问题

Just for informational sake, I can tell you that the creation of the BigDecimal coming back from the database is done by the proprietary JDBC driver's implementation of the 'getBigDecimal' method of the database-specific 'ResultSet' sub-class.

I found this out by stepping thru the Hibernate source code with a debugger, while trying to find the answer to my own question.

岁月染过的梦 2024-11-25 06:45:12

我认为这会起作用,但我没有测试过。

public class BigDecimalPOJO implements Serializable {

    private static final long serialVersionUID = 8172432157992700183L;

    private final int SCALE = 20;
    private final RoundingMode ROUNDING_MODE = RoundingMode.CEILING;
    private BigDecimal number;

    public BigDecimalPOJO() {

    }

    public BigDecimal getNumber() {
        return number.setScale(SCALE, ROUNDING_MODE);
    }

    public void setNumber(BigDecimal number) {
        this.number = number.setScale(SCALE, ROUNDING_MODE);
    }
}

I think this will work, I didn't test it though.

public class BigDecimalPOJO implements Serializable {

    private static final long serialVersionUID = 8172432157992700183L;

    private final int SCALE = 20;
    private final RoundingMode ROUNDING_MODE = RoundingMode.CEILING;
    private BigDecimal number;

    public BigDecimalPOJO() {

    }

    public BigDecimal getNumber() {
        return number.setScale(SCALE, ROUNDING_MODE);
    }

    public void setNumber(BigDecimal number) {
        this.number = number.setScale(SCALE, ROUNDING_MODE);
    }
}
机场等船 2024-11-25 06:45:12

不确定,但您可以使用 a.compareTo(b) == 0 检查相等性。

Not sure, but you can check equality using a.compareTo(b) == 0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文