6
votes

Hibernate - Précision de cartographie bigdecimale

problème: On dirait que ma classe de mappage pour une grande décimale est la chute de 0 lors de la saisie de valeurs de 50,20 à partir de la base de données Oracle. Il prendra la valeur correctement si ses 50,23 mais rien avec un 0 à la fin. J'imagine que c'est quelque chose de simple, je manque. Suggestions? Merci d'avance.

Détails

base de données: Oracle 11g Définition du champ: numérique (8,2)

Mappage getter / setter xxx


1 commentaires

Lorsque j'exécute l'hibernate .Betlist, il saisit 50,2 et pas 50,20 comme dans la base de données. La seule chose à laquelle je puisse penser, c'est qu'il a à voir avec la cartographie sur le terrain. J'ai aussi essayé de faire un double, n'a fait aucune différence.


3 Réponses :


6
votes

50,2 est identique à 50.20, 50.200, etc. Si vous souhaitez l'afficher avec deux chiffres, utilisez java.text.decimalformat.format (..)

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


5 commentaires

Ya mais pourquoi hiberniserait-il la coupe? Dans la base de données sa 50.20, ma classe de cartographie ne devrait pas couper le trailing 0 Je penserais par défaut.


C'est juste un problème de présentation. Noone Garnies Le zéro, il n'est tout simplement pas affiché par Tostring.


Vous voulez dire le Tostring même dans le débogueur? Le prix est mappé sur un bigdecimal. Dans mon code lorsque j'ai défini le point de pause sur le point où il reçoit cette liste des valeurs d'objet, je vois la valeur mappée comme 58.2. Aucune totring n'est pas encore appelée. Je pensais juste que d'avoir cette annotation de précision sur mon @Column, il conserverait la valeur.


Comme je l'ai dit, la précision concerne le maximum. Pour définir la manière dont vous souhaitez l'afficher, utilisez un format décimal.


Le débogueur utilise Tostring pour afficher les BigDecimaux.



3
votes

Je peux vous dire que la création de la valeur BigDecimal Revenant de la base de données est effectuée par la mise en œuvre exclusive du pilote JDBC de la méthode getbigdecimal de la base de données spécifique ResultatsSet Sous-classe.

J'en ai trouvé cela en tranchant le code source hibernate avec un débogueur, tout en essayant de trouver la réponse à ma propre question .

Il semble que certaines implémentations de la méthode getbigdecimal utilisent la précision / échelle définie dans le schéma de base de données ou tenteront d'optimiser le bigdecimal renvoyé par définition La précision / échelle minimale requise pour contenir la valeur récupérée. Je suppose que le pilote Oracle fait ce dernier.

Voir aussi cette autre question .


0 commentaires

-4
votes

dans la classe logique des affaires Vous pouvez définir de la valeur de cette manière aussi:

objet_name.setprice (nouveau bigdecimal (50.20));


0 commentaires