2010-05-20 3 views
4

Я использую Hibernate JPA в моем бэкэнде. Я пишу блок-тест с использованием JUnit и DBUnit для вставки набора данных в базу данных HSQL в памяти.Вставка BigDecimal данных в базу данных тестирования HSQLDB с использованием DbUnit

Мой набор данных содержит:

<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 не выполнял округление, и это определенно не потому, что я могу вставить объект строки заказа с использованием кода Java со значением, например 5.3, и он отлично работает.

Мне кажется, что DBUtils по какой-то причине округляет число, которое я определил. Есть ли способ заставить это не произойти? Может ли кто-нибудь объяснить, почему это может быть сделано?

Спасибо!

ответ

0

Я сделал быстрый тест на моей стороне с DbUnit 2.2.2, HSQLDB 1.8.0.10 и Hibernate EM 3.4.0.GA и все работает, как ожидалось:

  • DbUnit правильно вставляет десятичные значения в discount_price колонка типа numeric(12,2)
  • Спящий правильно считывает discount_price значения в BigDecimal discountPrice
  • следующий assertEquals(0.3d, orderLine.getDiscountPrice().doubleValue()) проходит

Итак, мои вопросы:

  • Какую версию DbUnit вы используете точно?
  • Как вы в точности утверждаете? Вы тоже используете API DbUnit?
1

У меня была аналогичная проблема ... неподвижную обновлением до 3.6 в спящем

2

я натыкался на этот вопрос, так как я боролся с подобной проблемой, к сожалению, в моей текущей настройки я не в состоянии обновить спящий режим. Поэтому я нашел другое решение, которое устраняет проблему без необходимости обновления спящего режима. Думал, что это не повредит. Вы просто расширяете HSQLDialect

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

Это лучший ответ, он работает для меня. –