BigDecimal précision pas persisté, avec des annotations JPA
Je suis en utilisant le javax.persistence API Hibernate et à créer des annotations et de persister les entités et leurs attributs dans une base de données Oracle 11g Express de la base de données.
J'ai l'attribut suivant dans une entité:
@Column(precision = 12, scale = 9)
private BigDecimal weightedScore;
L'objectif est de conserver une valeur décimale avec un maximum de 12 chiffres et d'un maximum de 9 de ces chiffres à droite de la virgule.
Après le calcul de weightedScore
, le résultat est 0.1234, mais une fois que j'ai commis à l'entité avec la base de données Oracle, la valeur s'affiche comme 0.12.
Je peux voir ce qui en soit à l'aide d'un objet EntityManager à la requête de l'entrée ou en consultant directement dans le Oracle Application Express (Apex) de l'interface dans un navigateur web.
Comment dois-je annoter mon BigDecimal attribut de sorte que la précision est conservé correctement?
Remarque: Nous utilisons une mémoire de base de données HSQL pour exécuter nos tests unitaires, et il ne rencontrez pas le problème avec le manque de précision, avec ou sans le @Column
annotation.
Mise à jour:
En regardant la description de la table, la définition de la weightedScore
colonne est NUMBER(19, 2)
. Maintenant j'ai aussi essayé de changer l'annotation à @Column(columnDefinition="Number(12, 9)")
, mais cela n'a eu aucun effet. Personne ne sait pourquoi Oracle ne répond pas à ces annotations?
OriginalL'auteur David Kaczynski | 2012-06-08
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la réponse. Huzzah!
J'ai tenté d'exécuter la requête suivante par le biais de l'Oracle Apex interface:
alter table NODE modify (WEIGHTEDSCORE NUMBER(12, 9));
J'ai reçu un message d'erreur indiquant qu'une colonne contenant les données ne peuvent pas être modifiés pour avoir moins de précision ou moins grande échelle. C'était mon problème!
Parce que j'ai été de tenter de modifier le tableau avec les données existantes, il me faut soit le supprimer de la table et de ré-initialiser ou de modifier la colonne de n'avoir plus de précision et l'échelle.
J'ai essayé la requête suivante avec succès:
alter table NODE modify (WEIGHTEDSCORE NUMBER(26, 9));
Le raisonnement est que je veux ajouter 7 places de précision à la droite de la virgule, donc je suis ajoutant des 7 à l'ensemble de la précision pour compenser l'augmentation d'échelle. De cette manière, la colonne peut garder tous les précision sur la gauche de la virgule lors de l'ajout de précision sur le côté droit.
OriginalL'auteur David Kaczynski
Il semble que vous n'êtes pas le seul à avoir du mal avec ce: http://www.eclipse.org/forums/index.php/m/716826/
OriginalL'auteur siebz0r