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

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

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

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

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

仅为了提供信息,我可以告诉您,从数据库返回的BigDecimal的创建是由专有JDBC驱动程序实现的特定于数据库的“ResultSet”子类的“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来检查相等性。