【问题标题】:Exception saving Java BigDecimal 0.0000001 to oracle using JPA/Hibernate使用 JPA/Hibernate 将 Java BigDecimal 0.0000001 保存到 oracle 的异常
【发布时间】:2015-07-02 02:39:27
【问题描述】:

当我尝试将具有值 new BigDecimal("0.0000001") 的属性的实体的值保存到具有数据类型 Number (10,7) 的 Oracle 表列中时,我看到了一个异常。 其他具有相同比例的值,例如新的 BigDecimal ("0.0000012") 被保存。

以下是我看到的例外

13:56:56,561 WARN [JDBCExceptionReporter] SQL 错误:1438,SQLState:22003 13:56:56,561 错误 [JDBCExceptionReporter] ORA-01438: 值大于此列允许的指定精度

【问题讨论】:

  • 这被称为 0.1 的不可表示性 en.wikipedia.org/wiki/Floating_point#Accuracy_problems
  • 但是保留六位小数的值没有问题 BigDecimal("0.000001")
  • 我不相信值 0.0000001 是导致您的问题的原因。您的错误消息中的关键字是 larger:0.0000001 对于您的列来说并不太大,所以这对我来说意味着您的表中发生了一些您没有告诉我们的事情。例如,您的表是否有一个触发器来计算列中值的倒数?请编辑您的问题以包含您看到的异常的完整堆栈跟踪。
  • 如果通过sqlplus存储相同的值,它是否有效?如果 JDBC 驱动程序在存储到数据库之前将 BigDecimal 转换为浮点数,那么这是一个错误。也许尝试使用其他版本的驱动程序。 BigDecimal 和 Oracle NUMBER 都将数字存储为十进制数字,无需将它们转换为浮点数。可能它也可能是 Hibernate 中的一个错误。
  • 当我尝试从 Toad 保存它时允许

标签: java hibernate jpa oracle11g bigdecimal


【解决方案1】:

这一切正常,可能是其他原因引起的错误

drop table test;

Create table test (
BigDecimal Number (10,7)
);

insert into  test values (0.0000001);
insert into  test values (0.0000012);
insert into  test values (101);
insert into  test values (102);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多