如何在Hibernate中映射BigDecimal,以便恢复我放入的相同比例?

时间:2011-07-01 06:08:29

标签: java sql-server hibernate hibernate-mapping bigdecimal

在Java中,new BigDecimal("1.0") != new BigDecimal("1.00")scale matters

然而,对于Hibernate / SQL Server来说显然不是这样。如果我将BigDecimal的比例设置为特定值,通过Hibernate将BigDecimal保存到数据库然后重新膨胀我的对象,我会返回一个不同比例的BigDecimal。

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

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

3 个答案:

答案 0 :(得分:2)

仅为了提供信息,我可以告诉您,从数据库返回的BigDecimal的创建是由专有JDBC驱动程序对特定于数据库的“ResultSet”子类的'getBigDecimal'方法的实现完成的。 / p>

我通过使用调试器逐步通过Hibernate源代码找到了这个,同时尝试找到我自己question的答案。

答案 1 :(得分:0)

我认为这会奏效,但我没有测试过。

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

答案 2 :(得分:-2)

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