Quelles sont les meilleures solutions pour les problèmes connus liés à la validation de schéma des colonnes à virgule flottante par Hibernate lors de l’utilisation d’Oracle 10g?

J’ai plusieurs classes Java avec des champs doubles que je persiste via Hibernate. Par exemple, j’ai

@Entity public class Node ... private double value; 

Lorsque org.hibernate.dialect.Oracle10gDialect de Hibernate crée le DDL pour la table Node, il mappe le champ de valeur sur un type “double précision”.

 create table MDB.Node (... value double precision not null, ... 

Il semblerait que dans Oracle, “double précision” est un alias pour “float”. Ainsi, lorsque j’essaie de vérifier le schéma de firebase database à l’aide de la méthode org.hibernate.cfg.AnnotationConfiguration.validateSchema() , Oracle semble décrire la colonne de valeur comme un “float”. Cela provoque Hibernate à lancer l’exception suivante

 org.hibernate.HibernateException: Wrong column type in DBO.ACL_RULE for column value. Found: float, expected: double precision 

Un problème très similaire est répertorié dans la firebase database JIRA d’Hibernate sous le nom de HHH-1961 . Je voudrais éviter de faire quoi que ce soit qui briserait MySql, Postgres et Sql Server, donc l’extension d’ Oracle10gDialect semble être la plus prometteuse des solutions mentionnées dans HHH-1961 . Mais étendre un dialecte est quelque chose que je n’ai jamais fait auparavant et j’ai peur qu’il y ait des pièges méchants. Quelle est la meilleure solution de contournement pour ce problème qui ne brise pas notre compatibilité avec MySql, Postgres et Sql Server?

Ceci est une limitation connue du validateur de schéma, vérifiez HHH-2315 . Vous avez donc trois options ici (en fait quatre mais je suppose que la désactivation de la validation n’est pas souhaitée). Non plus:

  • Utilisez un float au lieu d’un double au niveau Java – cela pourrait ne pas être une option cependant.

  • Patch org.hibernate.mapping.Table.validateColumns(Dialect dialect, Mapping mapping, TableMetadata tableInfo) pour append une condition particulière à ce cas particulier – ce n’est pas vraiment une option légère.

  • Étend l’ org.hibernate.dialect.Oracle10gDialect pour qu’il utilise float pour le type SQL DOUBLE

     public class MyOracle10gDialect extends Oracle10gDialect { public MyOracle10gDialect() { super(); } protected void registerNumericTypeMappings() { super.registerNumericTypeMappings(); registerColumnType( Types.DOUBLE, "float" ); } } 

La dernière option semble sans danger mais nécessitera des tests pour voir si elle n’introduit aucune régression. Je n’ai pas regardé le code de pilote JDBC d’Oracle, donc je ne peux pas dire en quoi la float et la double precision diffèrent au niveau du pilote.

il suffit d’append (columnDefinition = “NUMBER (9,2)”)!

 @Column(name = "CREDIT_AMOUNT", columnDefinition = "NUMBER(9,2)") @Basic private double creditAmount; 

Il y avait un problème similaire HHH-1598 avec les mappages HSQL des champs booléens, et une discussion à ce sujet ici .

La solution que j’ai choisie était dans la discussion référencée ci-dessus, avec une extension de HSQLDialect.

Je n’ai vu aucun problème avec cela, bien que j’utilise seulement HSQL dans les tests.

Cela n’interfère certainement avec aucune autre firebase database.

Utilisez l’atsortingbut “scale” sur votre membre.