conectar con java oracle hibernate orm

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 un double 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 use float para el tipo de SQL DOUBLE

    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;