2010-05-20 4 views
4

J'utilise Hibernate JPA dans mon backend. J'écris un test unitaire en utilisant JUnit et DBUnit pour insérer un ensemble de données dans une base de données HSQL en mémoire.Mise en données BigDecimal dans la base de données de test HSQLDB en utilisant DbUnit

Mon jeu de données contient:

<order_line order_line_id="1" quantity="2" discount_price="0.3"/> 

Quelles cartes à un objet Java OrderLine où est défini la colonne discount_price comme:

@Column(name = "discount_price", precision = 12, scale = 2) 
private BigDecimal discountPrice; 

Cependant, quand je lance mon cas de test et d'affirmer que la remise le prix retourné est égal à 0,3, l'assertion échoue et dit que la valeur stockée est 0. Si je change le discount_price dans l'ensemble de données à 0,9, il arrondit à 1.

J'ai vérifié pour m'assurer que HSQLDB ne fait pas l'arrondi et ce n'est certainement pas parce que je peux insérer un objet de ligne de commande en utilisant du code Java avec une valeur comme 5.3 et ça fonctionne bien.

Pour moi, il semble que DBUtils arrondisse pour une raison quelconque le nombre que j'ai défini. Y a-t-il un moyen de forcer cela à ne pas arriver? Quelqu'un peut-il expliquer pourquoi il pourrait le faire?

Merci!

Répondre

0

J'ai fait un test rapide de mon côté avec DbUnit 2.2.2, HSQLDB 1.8.0.10 et Hibernate EM 3.4.0.GA et les choses fonctionnent comme prévu:

  • DbUnit insère correctement les valeurs décimales dans un discount_price colonne de type numeric(12,2)
  • Hibernate lit correctement les valeurs discount_price dans un BigDecimal discountPrice
  • les éléments suivants assertEquals(0.3d, orderLine.getDiscountPrice().doubleValue()) passe

Donc mes questions sont:

  • Quelle version de DbUnit utilisez-vous exactement?
  • Comment faites-vous votre affirmation exactement? Avez-vous DbUnit API pour cela aussi?
1

J'ai eu un problème similaire ... fixé par la mise à niveau à Hibernate 3.6

2

je suis tombé sur cette question depuis que je me battais avec un problème similaire, malheureusement dans ma configuration actuelle, je ne suis pas en mesure de mettre à jour hibernate. J'ai donc trouvé une solution différente qui résout le problème sans avoir besoin de mettre à jour Hibernate. Je pensais que ça ne nuirait pas à partager. Vous étendez simplement le HSQLDialect

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

Ceci est la meilleure réponse, cela fonctionne pour moi. –

Questions connexes