10
votes

Hibernate: Trouvé: flotteur, attendu: double précision

J'ai un problème avec la cartographie du type de données Double précision Oracle Float à Java Double DataType. Le validateur de schéma Hibernate semble échouer lorsque le double type de données Java est utilisé.

org.hibernate.HibernateException: Wrong column type in DB.TABLE for column amount. Found: float, expected: double precision


4 commentaires

Pourriez-vous montrer comment vous mappez cette colonne? BTW En notant que vous êtes dans les dernières minutes avant de vous rendre à la production, vous vous assurez simplement d'obtenir des remarques Witty sur votre négligence de tester votre application en temps voulu :-)


Haha :) Ne t'inquiète pas, je ne suis pas négligé quand il s'agit de produire de la production. Cela ne va pas aussi longtemps qu'il n'est pas corrigé. Quoi qu'il en soit, c'est un bug que l'un de mes collègues encloutered et j'essaie simplement de l'aider. Belle remarque cependant :)


J'ai édité ma question selon votre suggestion. THX.


J'ai bien peur que vous vous dirigiez mal ici. Oracle SQL ne fait pas de type de données comme double ou float. Le seul numéro de données numérique autorisé pour la colonne est le numéro . Vous pouvez appeler des procédures PL / SQL avec des paramètres de type Binarin_Double, mais c'est quelque chose de différent, ce type de données ne peut pas être stocké dans la base de données. Si vous souhaitez être en sécurité, cartographiez le numéro d'Oracle (comme ses sous-types) à BigDecimal de Java.


8 Réponses :


4
votes

Besoin de plus d'informations. La table est double? Je ne connais pas l'oracle, mais est-ce un type de point flottant? Qu'est-ce que java.sql.types est-il traduit? Vous pouvez voir le java.sql.types à la mappage de type de base de données dans la classe de dialecte pour votre base de données. Dans ce cas, il est org.hibernate.dialect.oracle10gdialect (qui s'étend 9i et 8i). On dirait que vous avez xxx

donc, la table doit être définie comme double précision et que la classe Java doit être définie comme quelque chose qui fera mapper vers Types.double , généralement double .

à partir du message d'erreur, il semble que votre table est définie comme float qui utiliserait cette mappage xxx

pour laquelle le type Java attendu serait quelque chose qui correspond à types.float , généralement float ; Une valeur de précision unique.

La chose la plus facile à faire est de changer votre table ou votre classe Java. Alternativement, vous pouvez spécifier un type d'utilisateur qui ferait mapper une valeur de précision unique sur une valeur de précision à double précision; Je ne peux pas penser à la raison pour laquelle vous voudriez vraiment faire cela, mais peut-être que si vous n'aviez pas de contrôle sur la classe et la table, ce qui est assez rare, je penserais.

htH.


0 commentaires

2
votes

Nous avions le même problème. Nous avons résolu en veillant à définir explicitement le type de colonne dans le mappage, comme celui-ci:

<property name="performance" type="double">
  <column name="PERFORMANCE" sql-type="float" />
</property>


0 commentaires

0
votes

J'ai eu un cas où mon type de colonne Oracle était numéro et le type Java était double .

a finalement tracé qu'il s'agissait de réglages

valider

juste changé en

mise à jour

Et tout a fonctionné!


0 commentaires

12
votes

sauf si vous définissez un type de colonne comme double précision dans ddl, l'oracle le convertira en float type de colonne. Vous devez donc vous inscrire à double chose en tant que type de colonne de flotteur dans la classe dialecte.
xxx

Enfin, enregistrez-vous oracle10gdialectextended dans hibernate / jpa configuration comme hibernate.dialect .


1 commentaires

Il n'a pas été travaillé en ajoutant la classe Oracle10gdialectextenseTextenseD dans hibernate.cfg.xml Fichier: oracle10gdialectextended



-1
votes

J'ai eu cette question lors de la migration d'une application JBoss 4 / hibernate 3 sur AS7 / Hibernate4. Problème résolu par la suggestion de Rob Keilty de modifier HBM2DDL.Auto de Valider à la mise à jour sans avoir à modifier le code hérité.


0 commentaires

5
votes

Si vous utilisez la méthode d'annotation, vous devez déclarer type de colonne comme ci-dessous pour le champ. XXX


0 commentaires

1
votes

Application.Properties

hibernate.dialect = com.test.config.oracle10gdialectextext

Créer une classe xxx


0 commentaires

0
votes

Après de nombreuses recherches et essais, j'ai trouvé la solution. Pour le domaine GRAVES, nous pouvons résoudre ce problème en ajoutant le SQLTYPE comme "flotteur" pour le mode de validation.

in résultat.Groovy xxx

de sorte qu'il supprimera l'erreur en mode de validation.


0 commentaires