如何在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
来检查相等性。