首页 > 解决方案 > BigDecimal 与 JPA 和灵活的规模

问题描述

我必须BigDecimal在 JPA 中映射一个:

@Column(name = "price", precision = 16, scale = 4)
private BigDecimal price;

精度和比例也在数据库中正确设置。

但是,对于给定的比例,所有值都以 4 的比例存储,即使该值只需要 2 的比例。例如,如果我使用如下数字:

12.12345678

然后这个值被截断为

12.1234

甚至精度也允许更高的比例为 4(因为允许的精度为 16,使用的精度为 6,因此 Hibernate 可以多存储 10 位数字,即使需要更高的比例也可以使用这些数字)。

有什么方法可以让休眠根据实际比例及其精度而不是硬编码比例来调整比例?如果我映射没有比例的 BigDecimal:

@Column(name = "price", precision = 16)
private BigDecimal price; 

然后 Hibernate 默认为 2。是否有类似JPA中可用最大值的灵活比例?precision因为在内部,BigDecimal 完全是这样的:如果没有给出比例(这是默认值),那么 java 会根据可用的精度调整所需的比例。

标签: javahibernatejpa

解决方案


在保存实体之前,您可能需要诸如@PrePersist @PreUpdate注释之类的东西来修复您的BigDecimal比例。

就像是:

@PrePersist
@PreUpdate
    public void pricePrecisionConvertion() {
        // convert your bigdecimal scale to 2 here
        this.price.setScale(2, RoundingMode.HALF_UP);
    }

将 JPA设置@Column为灵活的规模(我认为这是不可能的),您的数据库也可能需要灵活,而且我认为数据库通常没有这个选项。


推荐阅读