我最近将 Java 1.4 应用程序迁移到 Java 6 环境。不幸的是,我遇到了一个问题BigDecimal
存储在Oracle数据库中。总而言之,当我尝试存储"7.65E+7"
大十进制值 (76,500,000.00
)在数据库中,Oracle 实际上存储了以下值7,650,000.00
。这个缺陷是由于重写了BigDecimal
Java 1.5 中的类(参见here https://bugs.java.com/bugdatabase/view_bug?bug_id=6298816).
在我的代码中,BigDecimal
是从一个创建的double
使用这种代码:
BigDecimal myBD = new BigDecimal("" + someDoubleValue);
someObject.setAmount(myBD);
// Now let Hibernate persists my object in DB...
在超过 99% 的情况下,一切正常。除了极少数情况下,会发生上述错误。这很烦人。
如果我更改前面的代码以避免使用 String 构造函数BigDecimal
,那么我就没有遇到这个bug在我的用例中:
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 使用
toPlainString()
代替toString()
处理时的方法BigDecimal
(在这种情况下该怎么做)?
- 还有其他解决方案吗?
环境信息:
- 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
Edit :我已经使用 Oracle JDBC 版本 10.2.0 测试了相同的错误代码。4.0 并且该错误确实发生了not发生!存储的值确实是76,500,000.00
...
关于变更日志 http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/readme_jdbc_10204.html,可能与错误#4711863有关。