java - con - spring.datasource.url oracle
¿Cuáles son las mejores soluciones para problemas conocidos con la validación del esquema de Hibernate de las columnas de punto flotante cuando se usa Oracle 10g? (4)
Esta es una limitación conocida del validador de esquema, verifique HHH-2315 . Por lo tanto, tiene tres opciones aquí (en realidad cuatro, pero supongo que desactivar la validación no es deseable). Ya sea:
Use un
float
lugar de undouble
en el nivel de Java, aunque podría no ser una opción.Parche
org.hibernate.mapping.Table.validateColumns(Dialect dialect, Mapping mapping, TableMetadata tableInfo)
para agregar una condición especial para este caso en particular, esto no es realmente una opción ligera.Extiende el
org.hibernate.dialect.Oracle10gDialect
para hacer que usefloat
para el tipo de SQLDOUBLE
public class MyOracle10gDialect extends Oracle10gDialect { public MyOracle10gDialect() { super(); } protected void registerNumericTypeMappings() { super.registerNumericTypeMappings(); registerColumnType( Types.DOUBLE, "float" ); } }
La última opción parece segura pero requerirá algunas pruebas para ver si no introduce ninguna regresión. No miré el código del controlador JDBC de Oracle, por lo que no puedo decir cómo la float
y la double precision
difieren en el nivel del controlador.
Tengo varias clases de Java con campos dobles que estoy persistiendo a través de Hibernate. Por ejemplo, tengo
@Entity
public class Node ...
private double value;
Cuando org.hibernate.dialect.Oracle10gDialect
de Hibernate crea el DDL para la tabla de Nodos, asigna el campo de valor a un tipo de "doble precisión".
create table MDB.Node (... value double precision not null, ...
Parece que en Oracle, "precisión doble" es un alias para "flotar". Entonces, cuando trato de verificar el esquema de la base de datos utilizando el método org.hibernate.cfg.AnnotationConfiguration.validateSchema()
, Oracle parece describir la columna de valor como un "flotante". Esto hace que Hibernate lance la siguiente excepción.
org.hibernate.HibernateException: Wrong column type in DBO.ACL_RULE for column value. Found: float, expected: double precision
Un problema muy similar aparece en la base de datos JIRA de Hibernate como HHH-1961 . Me gustaría evitar hacer cualquier cosa que interrumpa el soporte de MySql, Postgres y Sql Server, por lo que la extensión del Oracle10gDialect
parece ser la solución más prometedora mencionada en HHH-1961 . Pero extender un dialecto es algo que nunca he hecho antes y me temo que puede haber algunas trampas desagradables. ¿Cuál es la mejor solución para este problema que no rompa nuestra compatibilidad con MySql, Postgres y Sql Server?
Hubo un problema similar HHH-1598 con las asignaciones HSQL de campos booleanos, y una discusión de esto here .
La solución que elegí usar estaba en la discusión mencionada anteriormente, con una extensión de HSQLDialect.
No vi ningún problema con esto, aunque solo uso HSQL en las pruebas.
Ciertamente no interfiere con ningún otro DB.
Use el atributo ''escala'' en su miembro.
simplemente agregando (columnDefinition = "NUMBER (9,2)") funciona!
@Column(name = "CREDIT_AMOUNT", columnDefinition = "NUMBER(9,2)")
@Basic
private double creditAmount;