JPA automatique BigDecimal de conversion
Nous sommes la génération de nos jpa accès couches avec MyEclipse. Ensuite, nous avons généré des modèles de données et de la couche d'accès aux services. Nous avons rencontré quelques problèmes pour certains champs avec une précision définie.
Entité:
@Entity
public class TestEntity{
@Column(name="DECTEST", scale = 3, precision = 13)
BigDecimal decTest;
}
Maintenant nous allons créer un haricot et essayer de la sauver:
TestEntity te = new TestEntity();
te.setDecTest(new BigDecimal(1.2));
TestEntityService.save(te);
Nous obtenons le message d'erreur suivant:
Causés par: com.ibm.db2.ccc.c.SqlException: [ibm][db2][ccc][t4][1037][11190] Exception s'est produite lors de BigDecimal de conversion. Voir ci-joint Throwable pour plus de détails.
Caused by: com.ibm.db2.jcc.a.a: [ibm][db2][jcc][converters][608][10994] Overflow occurred during numeric data type conversion of "1.1999999999999999555910790149937383830547332763671875".
at com.ibm.db2.jcc.a.e.a(e.java:61)
at com.ibm.db2.jcc.b.jb.a(jb.java:1772)
... 73 more
Le problème semble être que notre BigDecimals échelle est supérieur à celui de la base de données.
Un travail solution de contournement est:
TestEntity te = new TestEntity();
BigDecimal decTest = new BigDecimal(1.2);
te.setDecTest(decTest.setScale(3,RoundingMode.HALF_UP);
TestEntityService.save(te);
Avec cette solution de contournement, nous devons réduire le BigDecimals precicsion manuellement à celui de la base de données.
Toutefois, si le modèle de données des changements, il nous faudrait ajuster l'échelle, il y manuellement. Est-il un moyen d'obtenir notre jpa /hibernate mise en œuvre pour faire la conversion pour nous automatiquement? E. g. avec la définition d'une propriété. Le faire à l'endroit où l'on est de la création de la fève serait le mauvais endroit pour le faire de toute façon.
OriginalL'auteur Udo Held | 2012-08-10
Vous devez vous connecter pour publier un commentaire.
Vous pourriez utiliser un type d'utilisateur, ou vous pouvez simplement mettre en œuvre le setter de la propriété comme cela:
Cet arrondissement serait donc encapsulé dans l'entité.
Noter que l'utilisation d'un lit double pour initialiser un BigDecimal est un peu étrange. Si vous voulez
1.2
être stockés dans la BigDecimal, utiliseznew BigDecimal("1.2")
, et vous n'aurez pas un BigDecimal initialisé avec1.1999999999999999555910790149937383830547332763671875
.Vous m'avez sauvé quelques soucis avec votre commentaire à propos de ne pas l'analyse en double pour le constructeur de BigDecimal. c'était une tentation que j'avais besoin de dire non.
OriginalL'auteur JB Nizet