【问题标题】:Hibernate is mapping BigDecimal incorrectlyHibernate 不正确地映射 BigDecimal
【发布时间】:2012-01-24 15:16:24
【问题描述】:

我有两个@Entitys,都有一个BigDecimal 字段,如下所示:

在一个模块中:

@Entity
@Table(name = "price_range")
public class PriceRange extends AbstractPersistable<Long> {
    @Column(name = "price", precision = 19, scale = 4)
    private BigDecimal price;

在另一个模块中:

@Entity
@Table(name = "invoice_position")
public class InvoicePosition extends AbstractPersistable<Long> {
    @Column(name = "optimized_cost", precision = 19, scale = 4)
    private BigDecimal optimizedCost;

两者都在我的数据库中创建具有正确精度和比例值的表:

Table invoice_position
======================
id,optimized_cost, ...
----------------------
optimized_cost   decimal(19,4)

和

Table price_range
=================
id, price, ...
-----------------
price            decimal(19,4)

测试前端将值正确保存到数据库中。

但是在单元测试中,两者之一返回一个带有舍入误差的值:

0.520000000000000017763568394002504646778106689453125

(调试器说:sacle = 51 和精度 = 0)

当另一个工作正常时:

0.5200

(调试器说:比例 = 4,精度 = 4)

这两个值都以相同的方式从数据库中检索(EntityManager 在 JpaRepository 中使用 CriteriaBuilder 构建一个 CriteriaQuery):

List<Invoice> invoices = invoiceProvider.findAll();
List<PriceRange> priceRanges = priceRangeProvider.findAll();

这可能是什么问题?或者更好:如果实体具有正确的规模和精度以及数据库,它会哪里出错?

我在这里很茫然,我在哪里可以找到错误?

【问题讨论】:

  • 看起来可能是这样。那么在单元测试中初始化BigDecimal 的最佳实践是什么?使用String 感觉……很奇怪……
  • 你也可以用long初始化它们并缩放,但看起来也不太好。
  • 不过,使用字符串是正确的方法。由于舍入错误,其他任何事情都会失败。

标签: java hibernate scale precision bigdecimal


【解决方案1】:

好的,根据 cmets 将其标记为已回答,解决方案为 this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2023-04-04
    • 2022-07-06
    • 2022-09-27
    • 2016-08-27
    • 2014-09-09
    相关资源
    最近更新 更多