我如何在Hibernate中映射BigDecimal,以便恢复我输入的比例



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

然而,对于Hibernate/SQL Server来说,这显然不是真的。如果我将BigDecimal上的小数位数设置为特定值,通过Hibernate将BigDecial保存到数据库中,然后重新膨胀我的对象,我会得到一个具有不同小数位数的BigDecimal。

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

是否存在"正确"映射BigDecimal的Hibernate UserType,或者我必须自己编写?

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

我发现这一点是通过使用调试器逐步查看Hibernate源代码,同时试图找到我自己问题的答案。

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

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);
    }
}

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

最新更新