我在后端使用Hibernate JPA。我正在使用JUnit和DBUnit编写单元测试,以将一组数据插入到内存中的HSQL数据库中。
我的数据集包含:
<order_line order_line_id="1" quantity="2" discount_price="0.3"/>
映射到OrderLine Java对象,其中discount_price列定义为:
@Column(name = "discount_price", precision = 12, scale = 2)
private BigDecimal discountPrice;
但是,当我运行我的测试用例并声明返回的折扣价格等于0.3时,断言失败并表示存储的值为0.如果我将数据集中的discount_price更改为0.9,则它会向上舍入为1
我已经检查过以确保HSQLDB没有进行舍入,这肯定不是因为我可以使用类似5.3的值的Java代码插入订单行对象,并且它工作正常。
对我来说,似乎DBUtils由于某种原因舍入了我定义的数字。有没有办法可以迫使这种情况发生?任何人都可以解释为什么它可能会这样做吗?
谢谢!
答案 0 :(得分:3)
我遇到了这个问题,因为我遇到了类似的问题,不幸的是在我目前的设置中,我无法升级hibernate。所以我找到了一个不同的解决方案来解决问题而无需升级hibernate。认为分享不会有害。您只需扩展HSQLDialect
即可public class HSQLNumericWithPrecisionDialect extends HSQLDialect {
public HSQLNumericWithPrecisionDialect() {
super();
registerColumnType( Types.NUMERIC, "numeric($p, $s)" );
}
}
答案 1 :(得分:1)
我有一个类似的问题......通过升级到Hibernate 3.6来修复
答案 2 :(得分:0)
我使用DbUnit 2.2.2,HSQLDB 1.8.0.10和Hibernate EM 3.4.0.GA对我进行了快速测试,并且事情按预期工作:
discount_price
类型的numeric(12,2)
列discount_price
值读入BigDecimal discountPrice
assertEquals(0.3d, orderLine.getDiscountPrice().doubleValue())
次传递所以我的问题是: