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

2024-01-02

我最近将 Java 1.4 应用程序迁移到 Java 6 环境。不幸的是,我遇到了一个问题BigDecimal存储在Oracle数据库中。总而言之,当我尝试存储"7.65E+7"大十进制值 (76,500,000.00)在数据库中,Oracle 实际上存储了以下值7,650,000.00。这个缺陷是由于重写了BigDecimalJava 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有关。


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Java 1.4 迁移到 Java 1.5+ 时避免 BigDecimal 的问题 的相关文章

  • 使用SimpleMailMessage类发送邮件时如何使java字符串着色

    我正在使用 java 中的 SimpleMailMessage 类发送邮件 我将 spring 与 hibernate 结合使用 我想在发送邮件时将特定字符串设置为彩色 Code String emailBody Dear username
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • 模拟框架对我有什么作用?

    我听说有些我无法交谈的人是 jmock 的忠实粉丝 我已经做了以测试为中心的开发多年 所以我浏览了网站并查看了一些文档 但仍然不知道它有什么好处 我对春天也有同样的问题 如果您已经了解它是什么 他们的文档会很好地解释它 所以我并不认为 jm
  • 定制法国号码格式

    我尝试为美国国家 地区使用自定义数字格式 到目前为止效果很好 Not something I want NumberFormat numberFormat0 NumberFormat getNumberInstance Locale US
  • JLabel.setText() 中的换行符

    使用 JLabel setText 时如何插入换行符 我尝试使用 Html 但似乎可以使其适用于 setText 仅适用于 jLabel 的初始声明 最初声明 jlabel 时的方法是 label new JLabel Hello Worl
  • 在 Jenkins 内运行构建时,我收到“java/lang/OutOfMemoryError”

    2020 02 25 10 11 24 986 0000 id 79 信息hudson model AsyncPeriodicWork lambda doRun 0 开始maven repo cleanup 2020 02 25 10 11
  • lombok - 多个镜头中的 @Builder 模式

    I use Builder of 龙目岛项目 https github com rzwitserloot lombok 所以考虑我有这个例子 Builder public class Client private Getter Setter
  • 将 Spring Boot 应用程序部署到 Heroku 失败并显示“无效标志:--release -> [帮助 1]”

    当我尝试将代码部署到 Heroku 时 通过git push heroku master 我收到 Maven 错误 remote ERROR Failed to execute goal org apache maven plugins m
  • Spring Batch:比较数据库之间的数据

    我有两个数据库 Oracle 和 MySQL 目标是将Oracle表中的值保存到MySQL中 要求 MySQL表中不存在数据 但我在理解 Spring Batch 时遇到了困难 步骤中 它包含itemReader itemProcessor
  • WSDL 表示中的枚举类型

    WSDL 表示如下
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • 用java解密AES加密文件

    我有一个使用 AES 使用 java 应用程序加密的文件 我还有一个加密的密钥文件 但我不明白如何使用密钥来解密文件 大多数教程和示例都会在一个地方创建临时随机密钥 加密文件和解密 所以 问题是如何指定解密时必须使用的密钥 EDIT 我发现
  • 如何迭代SparseArray?

    有没有办法迭代 Java SparseArray 适用于 Android 我用了sparsearray通过索引轻松获取值 我找不到 看来我找到了解决方案 我没有正确注意到keyAt index 功能 所以我会这样做 for int i 0
  • Android:如何以编程方式仅圆化位图的顶角?

    我目前正在使用这段代码 Override public Bitmap transform Bitmap source Bitmap result Bitmap createBitmap source getWidth source getH
  • 如何实现再次播放功能?

    我希望在游戏结束时得到提示 如果我还想再玩一次的话 并使用 Y N 输入 退出游戏或重复游戏 我该如何以最有效的方式解决这个问题 编辑 描述资源路径位置类型 类型 Main Main java ScaredyCat src se grupp
  • 何时以及为何使用缓冲输入和输出流? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我读到这些是为了减少磁盘 网络调用开销而使用的 这在写操作的情况下似乎很好 但是进行缓冲读取有什么好处呢 如果您按字节读取文件 则每次都会进
  • 仅在java中使用数组计算50的阶乘

    我是java的初学者 我有一个作业要编写一个完整的程序 使用数组计算 50 的阶乘 我无法使用像 biginteger 这样的任何方法 我只能使用数组 因为我的教授希望我们理解背后的逻辑 我猜 然而 他并没有真正教我们数组的细节 所以我在这
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 跳过一行GridBagLayout

    我在 JFrame 上使用 GridBagLayout 我希望能够跳过一两行 但将这些行显示为空白 然后在这些行后面有一个按钮 我在文档中找不到任何方法来执行我所描述的操作 有谁知道我可以执行此操作的任何方法吗 发现它比添加空组件干净得多
  • 如何在 SpringDoc OpenAPI 3 中引用文件?

    我有 Spring Boot 项目 我想在其中记录我的 API 这里是正在处理的 Web 服务的示例 ApiResponses value ApiResponse responseCode 200 content Content media

随机推荐

  • 当从两个数据框构建绘图时有两个图例

    我有两个这样的数据框 library ggplot2 set seed 1 x1 rnorm 100 y1 rnorm 100 x2 rnorm 100 y2 rnorm 100 df1 data frame x x1 y y1 col1
  • 在 pdfmake 中嵌入背景图像

    我正在使用 pdfmakehttp bpampuch github io pdfmake index html gettingstarted http bpampuch github io pdfmake index html gettin
  • JavaPackage 对象不可调用错误:Pyspark

    像 dataframe show sqlContext read json 这样的操作工作正常 但大多数函数都会给出 JavaPackage object is not callable error 例如 当我这样做时 dataFrame
  • 当应用程序进入前台时查找当前视图。 IOS

    当应用程序激活时 我们如何找到当前哪个视图是第一响应者 我知道应用程序委托 applicationWillEnterForeground 和 applicationDidBecomeActive 在某些情况下将被调用 我如何使用它来亲密查看
  • django 模板中的 user.is_authenticated 遇到问题

    很抱歉 如果您在我之前问这个问题时尝试帮助我 不得不删除该问题 因为由于某种原因我不被允许编辑其他信息 我正在努力在我的 Django 网站上实现用户身份验证 一切正常 我的视图 模型 url 等都设置好了 用户可以注册 登录 注销 我遇到
  • 将 MarvinFramework 添加到 Tomcat7 上的 Web 应用程序

    我有一个JerseyWeb 应用程序运行于Tomcat并想要整合MarvinFramework用于图像处理 基本上我想减少噪音 灰度和缩放图像以进行进一步处理 The 马文框架 http marvinproject sourceforge
  • Cmder bash脚本执行

    我在 Windows 中创建了基本脚本 bin bash echo Hello 我正在使用 Cmder ConEmu 衍生品 我尝试使用 chmod 更改权限 但它们是相同的 我不知道如何执行这个脚本 正常的 Linux 方式是 hello
  • R 编译错误的 RGL 包

    尝试在 arch linux x86 64 上为 r 编译 rgl 我只复制了安装的错误部分 这是我最近更新 R 后发生的 知道如何解决这个问题吗 g I usr include R DNDEBUG DHAVE PNG H I usr in
  • 按位置列出观测值数量

    这里需要帮助 我正在尝试创建一个新列 使用纬度和经度列出餐厅 200 米范围内的餐厅数量 我在 stackoverflow 上找不到任何东西 而且我不是 R 忍者 任何帮助 将不胜感激 head business id restaurant
  • 带有azure ad的net core使用oidc和登录后浏览器后退按钮导致异常

    因此 我有一个新创建的 netcore 应用程序链接到我的 azure Active Directory 帐户 中间件设置如下 app UseCookieAuthentication new CookieAuthenticationOpti
  • 正确处理 React Hooks 以将摄像机流式传输到 HTML 视频元素

    我一直在尝试编写一个 React Hook 来处理从用户相机捕获的流式视频到 HTML 视频元素 我无法找到处理初始化和取消初始化相机和 HTML 视频元素的最佳方法 我尝试在挂钩末尾添加清理功能 但我的尝试最终导致视频反复重新初始化或出现
  • 使用 Codedom 生成 C# 自动属性

    有没有办法使用 Codedom 生成 C 自动属性or也许我可以使用另一组库 您可以使用 CodeSnippetTypeMember 类来实现此目的 例如 CodeTypeDeclaration newType new CodeTypeDe
  • 了解自动实现的属性

    我有一个使用自动实现属性的简单类 Public Class foo public foo public string BarName get set 显然 我在整个类中使用了变量 BarName 现在需要在设置属性值时添加逻辑 它必须全部大
  • opencv 对象跟踪的边界框定义

    如何定义采用 opencv tracker init 函数的边界框对象 是吗 xcenter ycenter boxwidht boxheight or xmin ymin xmax ymax or ymin xmin ymax xmax
  • 如何在 SwiftUI 中的 ForEach 中嵌入的 HStack 中设置相对宽度?

    我想创建属性列表 不使用列表视图 每个属性都是一个 HStack 其中包含两个文本 名称和值 我希望名称文本始终占整个 HStack 宽度的 30 而值文本则使用其余的水平空间 每个属性的高度取决于内容 我尝试通过以下观点来实现它 stru
  • 与多个包共享全局定义的数据库连接

    我读过一些关于如何处理数据库连接的 StackOverflow 答案 因为它是一个池 所以我们可以全局定义它并在多个 goroutine 中使用它 而且它是安全的 我遇到的问题是我已将 REST API 拆分为多个包 这些包中的每一个都需要
  • 我可以为 PHP 中的 $_POST 变量赋值吗?

    例如 我使用 POST 变量将数据插入数据库 就在这个查询之前 我有一些测试 如果它们是真的 我想调整那个 隐藏的 POST 值 Ex if baby dragon eats children POST hidden value grape
  • 删除锁定的互斥体

    我有一个包含多个资源的程序 需要通过它们自己的互斥锁来锁定 在这个程序中 可能会发生当 mutex for资源A被锁住了 资源A已在另一个线程中删除 以下代码尝试重现我尝试完成的逻辑 include
  • 如何在 JavaScript 中将 JSON 转换为数组

    我想将 JSON 转换为数组 并通过以下方式返回值 控制台 log 数据 值为 data object data object object 所以 我通过以下方式转换为 JSON console log JSON stringify dat
  • 从 Java 1.4 迁移到 Java 1.5+ 时避免 BigDecimal 的问题

    我最近将 Java 1 4 应用程序迁移到 Java 6 环境 不幸的是 我遇到了一个问题BigDecimal存储在Oracle数据库中 总而言之 当我尝试存储 7 65E 7 大十进制值 76 500 000 00 在数据库中 Oracl