Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-BigDecimal映射精度_Java_Hibernate - Fatal编程技术网

Java Hibernate-BigDecimal映射精度

Java Hibernate-BigDecimal映射精度,java,hibernate,Java,Hibernate,问题: 似乎我的大十进制映射类在从oracle数据库获取50.20之类的值时正在删除0。如果它的值为50.23,但末尾没有0,则它将正确获取该值。我想我错过了一些简单的东西。建议?提前谢谢 详细信息 数据库:Oracle 11G 字段定义:数字(8,2) 映射getter/setter @Column ( name="PRICE", precision = 8, scale = 2 ) private BigDecimal price; public BigDecimal getPri

问题: 似乎我的大十进制映射类在从oracle数据库获取50.20之类的值时正在删除0。如果它的值为50.23,但末尾没有0,则它将正确获取该值。我想我错过了一些简单的东西。建议?提前谢谢

详细信息

数据库:Oracle 11G 字段定义:数字(8,2)

映射getter/setter

    @Column ( name="PRICE", precision = 8, scale = 2 )
private BigDecimal price;

public BigDecimal getPrice()
{
    return price;
}
public void setPrice( BigDecimal price )
{
    this.price = price;
}

50.2与50.20、50.200等相同。如果要用两位数字显示,请使用


指定精度会限制小数位数的最大值,不是最小值。

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

我通过使用调试器单步遍历Hibernate源代码发现了这一点,同时试图找到问题的答案

似乎
getBigDecimal
方法的一些实现要么使用数据库架构中定义的精度/比例,要么通过仅定义保存检索值所需的最小精度/比例来优化返回的
BigDecimal
。我猜Oracle驱动程序正在做后者


另请参见。

在业务逻辑类中,您也可以通过以下方式设置值:


object_name.setPrice(新的BigDecimal(50.20))

Ya但为什么冬眠会修剪它?在数据库its 50.20中,默认情况下,我的映射类不应该修剪尾随的0。这只是e表示问题。没有人修剪零,它只是不通过toString显示。你是说即使在调试器中也会显示toString?价格被映射到一个BigDecimal。在我的代码中,当我在获取对象值列表的点上设置断点时,我看到值映射为58.2。还没有调用toString。我只是想,在@Column上添加精度注释可以保持该值。正如我所说,精度大约是最大值。为了设置如何显示它,请使用十进制格式。调试器使用toString显示大小数。当我执行hibernate.getList时,它获取50.2,而不是数据库中的50.20。我能想到的唯一一件事是它与映射到字段有关。我也试着把它做成双人的,没什么区别。