Hibernate 使用DbUnit将BigDecimal数据放入HSQLDB测试数据库

Hibernate 使用DbUnit将BigDecimal数据放入HSQLDB测试数据库,hibernate,testing,hsqldb,dbunit,Hibernate,Testing,Hsqldb,Dbunit,我在后端使用HibernateJPA。我正在编写一个单元测试,使用JUnit和DBUnit将一组数据插入内存中的HSQL数据库 我的数据集包含: <order_line order_line_id="1" quantity="2" discount_price="0.3"/> 但是,当我运行测试用例并断言返回的折扣价格等于0.3时,断言失败,并说存储值为0。如果我将数据集中的折扣价格更改为0.9,则取整为1 我已经检查了HSQLDB,以确保它没有进行舍入,而且肯定没有,因为我可以使

我在后端使用HibernateJPA。我正在编写一个单元测试,使用JUnit和DBUnit将一组数据插入内存中的HSQL数据库

我的数据集包含:

<order_line order_line_id="1" quantity="2" discount_price="0.3"/>
但是,当我运行测试用例并断言返回的折扣价格等于0.3时,断言失败,并说存储值为0。如果我将数据集中的折扣价格更改为0.9,则取整为1

我已经检查了HSQLDB,以确保它没有进行舍入,而且肯定没有,因为我可以使用Java代码插入一个订单行对象,其值类似于5.3,并且工作正常

对我来说,DBUtils似乎是出于某种原因而舍入了我定义的数字。有没有办法让这件事不发生?有人能解释为什么它会这样做吗


谢谢

我用DbUnit 2.2.2、HSQLDB 1.8.0.10和Hibernate EM 3.4.0.GA做了一个快速测试,一切正常:

  • DbUnit将十进制值正确插入类型为
    数值(12,2)
  • Hibernate将
    折扣\u价格
    值正确读入
    大十进制折扣价格
  • 以下
    assertEquals(0.3d,orderLine.getDiscountPrice().doubleValue())
    passes
因此,我的问题是:

  • 您使用的DbUnit的确切版本是什么
  • 你如何准确地表达你的主张?您是否也为其提供了DBUnitAPI

我有一个类似的问题…升级到Hibernate 3.6后修复了这个问题

我遇到了这个问题,因为我遇到了一个类似的问题,不幸的是,在我当前的设置中,我无法升级Hibernate。因此,我找到了一个不同的解决方案,它修复了这个问题,而不需要升级hibernate。我觉得分享不会有什么坏处。您只需扩展HSQL方言

public class HSQLNumericWithPrecisionDialect extends HSQLDialect {
    public HSQLNumericWithPrecisionDialect() {
        super();
        registerColumnType( Types.NUMERIC, "numeric($p, $s)" );
    }
}

我使用的是hibernate的最新版本以及hsqldb,所以hibernate升级不是我的选择。我使用这种方法,将$p替换为5,将$s替换为2(精度和比例),效果非常好。谢谢@krico
public class HSQLNumericWithPrecisionDialect extends HSQLDialect {
    public HSQLNumericWithPrecisionDialect() {
        super();
        registerColumnType( Types.NUMERIC, "numeric($p, $s)" );
    }
}