具有JPA和灵活规模的BigDecimal

时间:2019-09-30 15:48:36

标签: java hibernate jpa

我必须在JPA中映射一个BigDecimal

@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的依存关系中是否有类似 flexible scale 的东西?因为在内部,BigDecimal的操作完全类似于这样:如果未给出比例(这是默认设置),则Java将根据可用的精度调整所需的比例。

1 个答案:

答案 0 :(得分:1)

在保存实体之前,您可能希望使用类似@PrePersist @PreUpdate的注解来固定BigDecimal的比例。

类似的东西:

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

@Column设置为灵活地适应JPA(我认为这是不可能的),您的数据库也可能需要灵活,而且我不认为数据库通常具有此选项。