Java 如何在Hibernate中映射一个大的十进制数,以便恢复我输入的相同比例?

Java 如何在Hibernate中映射一个大的十进制数,以便恢复我输入的相同比例?,java,sql-server,hibernate,hibernate-mapping,bigdecimal,Java,Sql Server,Hibernate,Hibernate Mapping,Bigdecimal,在Java中,new BigDecimal(“1.0”)!=新的BigDecimal(“1.00”) 然而,对于Hibernate/SQL Server来说,这显然不是真的。如果我将BigDecimal上的比例设置为特定值,通过Hibernate将BigDecimal保存到数据库中,然后重新膨胀对象,我将得到一个具有不同比例的BigDecimal 例如,1.00的值返回为1.000000,我假设这是因为我们将大小数映射到定义为NUMERIC(19,6)的列。我不能将列定义为所需的刻度,因为我需要

在Java中,
new BigDecimal(“1.0”)!=新的BigDecimal(“1.00”)

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

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


是否存在一个Hibernate用户类型可以“正确”映射BigDecimal,或者我必须自己编写吗?

不确定,但您可以使用
a检查相等性。与(b)==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);
    }
}

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


我是通过一个调试器单步遍历Hibernate源代码发现这一点的,同时试图找到我自己的答案。

这对我并没有帮助——我需要保留小数位数以便于显示。这是一个完全不同的问题。您需要以一致的方式将数字表示为字符串<代码>字符串。格式(字符串、对象…将帮助您解决该问题。