2010-02-03 24 views
8

Tenemos una columna Oracle Date. Al principio en nuestra clase Java/Hibernate estábamos usando java.sql.Date. Esto funcionó pero no pareció almacenar ninguna información de tiempo en la base de datos cuando lo guardamos, así que cambié el tipo de datos de Java a Timestamp. Ahora tenemos este error:Tipo de Java para fecha/hora al usar Oracle Date con Hibernate

springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.an notation.PersistenceExceptionTranslationPostProcessor#0' defined in class path resource [margin-service-domain -config.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreatio nException: Error creating bean with name 'sessionFactory' defined in class path resource [m-service-doma in-config.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Wrong column type: CREATE_TS, expected: timestamp

Cualquier ideas sobre cómo asignar un oráculo Date mientras que conserva el fragmento de tiempo?


Actualización: Me puedo conseguir que funcione si uso el tipo de datos de Oracle Timestamp pero no quiero ese nivel de precisión idealmente. Solo quiero el Oracle básico Date.

+0

está usando hbm2ddl.auto? – Bozho

+0

No sé qué es eso, así que supongo que no. –

+0

Si esa es la funcionalidad de esquema de generación automática de hibernación, entonces no. –

Respuesta

7

No es una respuesta directa, pero que haría uso de la Oracle tipo TIMESTAMP:

  • TIMESTAMP (fractional_seconds_ precision) Year, month, and day values of date, as well as hour, minute, and second values of time, where fractional_seconds_precision optionally specifies the number of digits in the fractional part of the SECOND datetime field and can be a number in the range 0 to 9. The default is 6. For example, you specify TIMESTAMP as a literal as follows:

    TIMESTAMP'1997-01-31 09:26:50.124' 
    

con el fractional_second_precision deseada.

+0

Buena idea. Usé eso con una precisión de 2. El objetivo original era usar Oracle 'Date', pero esto funciona bien. –

+1

Esto es solo una solución temporal. Vea mi comentario sobre la respuesta de Brian sobre por qué su respuesta es la solución a su pregunta original. –

+0

Cuando hago esto, hibernate asigna la columna (ahora tipo de marca de tiempo) a una cadena en lugar de una fecha en Java. ¿Alguna idea de por qué? – kmehta

0

¿Ha vuelto a crear la base de datos después de realizar este cambio?

Si Hibernate creó originalmente la tabla utilizando un java.sql.Date para la columna, no tengo conocimiento de ninguna forma de que pueda cambiarla en función de un cambio en el código de Java solo.

1

Primero, tiene razón en que necesitaría usar una clase java.sql.Timestamp, ya que la clase java.sql.Date explícitamente no representa una hora específica del día (más bien, intenta representar medianoche GMT).

En cuanto a su error, no ha dado suficiente información para hacer algo más que adivinar (sería necesario mirar tanto la configuración de Hibernate como la clase para determinar realmente la causa). Sin embargo,, si simplemente cambió la clase del campo en la clase de Java, entonces por supuesto tendrá que actualizar también la asignación de Hibernate. Si no has hecho esto último, es probable que esto te lleve a un desajuste. Intente especificar explícitamente type="timestamp" para la asignación correspondiente.

EDITAR: Si está utilizando anotaciones, ¿actualizó la anotación en esa propiedad al @Temporal(TemporalType.TIMESTAMP)? Si no lo hiciste, entonces necesitarás (y si lo hiciste, deberías haberlo dicho así :-)).

+0

Estoy usando anotaciones, no veo el campo 'tipo' disponible. –

+0

Probé eso, mismo error. Preguntándose si es una "cosa de primavera". El error hace referencia a Spring bean ... –

8

Siempre uso java.util.Date con las fechas de Oracle y maneja bien la fecha y la hora.

+0

Esta es la respuesta correcta. La respuesta de Pascal de usar una columna de tipo TIMESTAMP es solo una solución. Si está 'forzado' a utilizar una columna tipo DATE (asignando Hibernate a un esquema existente que no puede modificar), entonces debe usar java.util.Date y NO java.sql.Date.Aquí hay una pregunta similar que cubre este caso: http://stackoverflow.com/questions/960923/mapping-an-oracle-date-to-a-java-object-using-hibernate –

+1

No recomendaría esto. Al usar java.util.Date, Hibernate se asigna a su TimestampType. Entonces Oracle puede convertir la columna DATE en TIMESTAMP, por lo que no se usará un índice existente y el rendimiento será realmente malo. Es mejor utilizar una marca de tiempo en todo momento. –

2

Quizás tenga this problem? Asegúrese de tener el último controlador JDBC, el nombre del archivo debe ser ojdbc5.jar.

0

Es necesario utilizar @Type (type = "org.joda.time.contrib.hibernate.PersistentDateTime") para la columna definida en la clase de entidad

Cuestiones relacionadas