java - 迁移到 Java 1.4 到 Java 1.5+ 时避免 BigDecimal 的问题

标签 java oracle bigdecimal

我最近将 Java 1.4 应用程序迁移到 Java 6 环境。不幸的是,我在 Oracle 数据库中遇到了 BigDecimal 存储的问题。总而言之,当我尝试在数据库中存储 "7.65E+7" BigDecimal 值 (76,500,000.00) 时,Oracle 实际上存储的值是 7,650,000.00。此缺陷是由于重写了 Java 1.5 中的 BigDecimal 类(参见 here )。

在我的代码中,BigDecimal 是使用这种代码从 double 创建的:

BigDecimal myBD = new BigDecimal("" + someDoubleValue);
someObject.setAmount(myBD);
// Now let Hibernate persists my object in DB...

在超过 99% 的情况下,一切正常。除了在极少数情况下,会出现上述错误。这很烦人。

如果我更改以前的代码以避免使用 BigDecimal 的 String 构造函数,那么我在我的用例中不会遇到错误:

BigDecimal myBD = new BigDecimal(someDoubleValue);
someObject.setAmount(myBD);
// Now let Hibernate persists my object in DB...

但是,我如何确定此解决方案是处理 BigDecimal 使用的正确方法?

所以我的问题是要知道如何管理我的 BigDecimal 值以避免此问题:

  • 不使用new BigDecimal(String)构造函数而直接使用new BigDecimal(double)
  • 强制 Oracle 在处理 BigDecimal 时使用 toPlainString() 而不是 toString() 方法(在这种情况下如何做到这一点)?
  • 还有其他解决方案吗?

环境信息:

  • Java 1.6.0_14
  • Hibernate 2.1.8(是的,这是一个很旧的版本)
  • Oracle JDBC 9.0.2.0 并使用 10.2.0.3.0 进行了测试
  • Oracle 数据库 10.2.0.3.0

编辑:我错误地测试了相同的代码,但是使用 Oracle JDBC 版本 10.2.0.4.0 并且该错误没有 发生!存储的值确实是 76,500,000.00... 关于changelog ,可能与错误 #4711863 有关。

最佳答案

在现代 Hibernate 版本中,您可以使用 UserType 将任何类映射到数据库字段。只需创建自定义 UserType 并使用它将 BigDecimal 对象映射到数据库列。

参见 http://i-proving.com/space/Technologies/Hibernate/User+Types+in+Hibernate

关于java - 迁移到 Java 1.4 到 Java 1.5+ 时避免 BigDecimal 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2622948/

相关文章:

sql - 如何从最大计算中获取完整行?

sql - 我想从表中插入随机的数据,我尝试过但失败了

oracle - ALL_CONSTRAINTS 和 ALL_CONS_COLUMNS 中的 OWNER 是否与表所有者相同?

java - 用 BigDecimal 计算圆周率

java - BigDecimal 输出不包含精确的十进制值?

java - Android Studio - Gradle 构建运行永无止境

java - 需要帮助编程战舰位置选择器/检查器

java - JNR-FFI 如何从指针到指针读取结构数组

java - 使用 Swing Worker 加载图片

java - 为什么 Java BigDecimal 返回 1E+1?