【问题标题】:BigDecimal precision not persisted with JPA annotationsJPA 注释不保留 BigDecimal 精度
【发布时间】:2012-06-12 22:31:03
【问题描述】:

我正在使用 javax.persistence API 和 Hibernate 在 Oracle 11g Express 数据库中创建注释和持久化实体及其属性。

我在一个实体中有以下属性:

@Column(precision = 12, scale = 9)
private BigDecimal weightedScore;

目标是保留一个最多 12 位的十进制值,其中小数点右侧最多为 9 位。

计算weightedScore后,结果是0.1234,但是一旦我用Oracle数据库提交实体,值显示为0.12。

我可以通过使用 EntityManager 对象来查询条目或在 Web 浏览器中直接在 Oracle Application Express (Apex) 界面中查看它来看到这一点。

我应该如何注释我的 BigDecimal 属性,以便正确地保持精度?

注意:我们使用内存中的 HSQL 数据库来运行我们的单元测试,无论有没有 @Column 注释,它都不会遇到精度不足的问题。

更新:

看表描述,weightedScore列的定义是NUMBER(19, 2)。我现在也尝试将注释更改为@Column(columnDefinition="Number(12, 9)"),但这没有效果。有谁知道为什么 Oracle 对这些注释没有响应?

【问题讨论】:

    标签: hibernate jpa oracle11g precision bigdecimal


    【解决方案1】:

    我找到了答案。呵呵!

    我尝试通过 Oracle Apex 界面执行以下查询:

    alter table NODE modify (WEIGHTEDSCORE NUMBER(12, 9));

    我收到一条错误消息,指出无法修改包含数据的列以降低精度或降低比例。这是我的问题!

    因为我试图用现有数据更改表,所以我需要删除表并重新初始化它,或者更改列以仅具有更高的精度和规模。

    我成功地尝试了以下查询:

    alter table NODE modify (WEIGHTEDSCORE NUMBER(26, 9));

    原因是我想在小数点右边加 7 位精度,所以我在整体精度上加 7 以补偿刻度的增加。这样,该列可以在小数点左侧保留所有现有精度,同时在右侧添加精度。

    【讨论】:

      【解决方案2】:

      看来你不是唯一一个遇到这个问题的人:http://www.eclipse.org/forums/index.php/m/716826/

      【讨论】:

      • 错误报告还说,该错误仅适用于大于 9,223,372,036,854,775,808 的值,并且已修复
      猜你喜欢
      • 2014-01-21
      • 2013-03-05
      • 1970-01-01
      • 2020-07-28
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多