2011-10-13 4 views
2

Problème: Semble ma classe de mappage pour une grande décimale abandonne 0 lorsque vous saisissez des valeurs comme 50.20 à partir de la base de données Oracle. Il va saisir la valeur correctement si son 50.23 mais rien avec un 0 à la fin. J'imagine que c'est quelque chose de simple que je manque. Suggestions? Merci d'avance.Hibernate - Précision de mappage BigDecimal

Détails

Base de données: Oracle 11G Définition: numérique (8,2)

getter mapping/setter

@Column (name="PRICE", precision = 8, scale = 2) 
private BigDecimal price; 

public BigDecimal getPrice() 
{ 
    return price; 
} 
public void setPrice(BigDecimal price) 
{ 
    this.price = price; 
} 
+0

Donc, il attrape 50,2? – Bozho

+0

lorsque j'exécute le .getList hibernate, il saisit 50.2 et non 50.20 tel qu'il est dans la base de données. La seule chose que je peux penser est que cela a à voir avec la cartographie sur le terrain. J'ai aussi essayé d'en faire un double, sans faire de différence. – haju

Répondre

4

50,2 est le même que 50,20, 50,200, etc. Si vous voulez l'afficher avec deux chiffres, utiliser java.text.DecimalFormat.format(..)

Spécifier la précision n limite le nombre maximum de chiffres décimaux, pas le minimum.

+0

Oui mais pourquoi hiberner? Dans la base de données de son 50.20, ma classe de mappage ne devrait pas couper les 0 de fin, je pense que par défaut. – haju

+0

Ceci est juste un problème de présentation. Personne ne supprime le zéro, il n'est simplement pas affiché par toString. – Bozho

+0

Vous voulez dire le toString même dans le débogueur? Le prix est mappé à un BigDecimal. Dans mon code lorsque je définis le point d'arrêt sur le point où il obtient cette liste de valeurs d'objet, je vois la valeur mappée en 58.2. Aucun toString n'est encore appelé. Je pensais juste en ayant cette annotation de précision sur mon @Column, il maintiendrait la valeur. – haju

3

Je peux vous dire que la création de la valeur BigDecimal en revenant de la base de données se fait par la mise en œuvre du pilote JDBC propriétaire de la méthode getBigDecimal de la sous-classe de base de données spécifique ResultSet. J'ai découvert cela en passant par le code source Hibernate avec un débogueur, tout en essayant de trouver la réponse à my own question. Il semble que certaines implémentations de la méthode getBigDecimal utilisent la précision/échelle définie dans le schéma de la base de données ou essaient d'optimiser le BigDecimal retourné en définissant uniquement la précision/échelle minimale requise pour contenir la valeur récupérée. Je devine que le pilote Oracle fait le dernier. Voir aussi this other question.

-3

en classe Affaires Logic vous pouvez définir la valeur de cette manière aussi:

object_name.setPrice (nouveau BigDecimal (50,20));