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.