2010-02-03 3 views
8

Abbiamo una colonna Data Oracle. Inizialmente nella nostra classe Java/Hibernate stavamo usando java.sql.Date. Questo ha funzionato, ma non sembrava che memorizzasse alcuna informazione temporale nel database quando salviamo, quindi ho cambiato il tipo di dati Java in Timestamp. Ora otteniamo questo errore:Tipo Java per data/ora quando si utilizza Oracle Date with 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

Tutte le idee su come mappare un Oracle Date, pur mantenendo la porzione di tempo?


Aggiornamento: posso farlo funzionare se uso il tipo di dati Oracle Timestamp, ma non voglio che il livello di precisione in posizione ideale. Voglio solo l'Oracle base Date.

+0

stai usando hbm2ddl.auto? – Bozho

+0

Non so cosa sia - quindi sto indovinando no. –

+0

Se questa è la funzionalità di generazione automatica dello schema di ibernazione, allora no. –

risposta

7

Non è una risposta diretta, ma mi piacerebbe utilizzare il tipo TIMESTAMP Oracle:

  • 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 il fractional_second_precision desiderato.

+0

Buona idea. Usalo con una precisione di 2. L'obiettivo originale era usare Oracle 'Date' ma questo funziona bene. –

+1

Questa è solo una soluzione. Vedi il mio commento sulla risposta di Brian sul motivo per cui la sua risposta è la soluzione alla tua domanda originale. –

+0

Quando si esegue questa operazione, l'ibernazione associa la colonna (ora il tipo di timestamp) a una stringa anziché a una data in Java. Qualche idea, perché? – kmehta

0

Hai ricreato il database dopo aver apportato questa modifica?

Se Hibernate ha originariamente creato la tabella utilizzando un java.sql.Date per la colonna, non sono a conoscenza di alcun modo in cui potrebbe modificarlo in base a una modifica del solo codice Java.

1

Prima di tutto - hai ragione che avresti bisogno di usare una classe java.sql.Timestamp, poiché la classe java.sql.Date non rappresenta esplicitamente una specifica ora del giorno (piuttosto, prova a rappresentare GMT di mezzanotte).

Per quanto riguarda il vostro errore - non avete dato abbastanza informazioni per fare qualcosa di più che per indovinare (occorrerebbe considerare sia la configurazione di Hibernate che la classe per determinare effettivamente la causa). Comunque, se hai semplicemente cambiato la classe del campo nella classe Java, allora ovviamente dovrai aggiornare anche la mappatura di Hibernate. Se non hai fatto quest'ultimo, probabilmente questo porterà alla tua mancata corrispondenza. Prova specificando esplicitamente type="timestamp" per la mappatura corrispondente.

MODIFICA: se si stanno utilizzando le annotazioni, l'annotazione su tale proprietà è stata aggiornata su @Temporal(TemporalType.TIMESTAMP)? Se non lo facessi, allora dovrai (e se lo hai fatto, avresti dovuto dirlo :-)).

+0

Sto usando le annotazioni, non vedo il campo 'tipo 'disponibile. –

+0

Provato questo, lo stesso errore. Mi chiedo se è una "cosa primaverile". L'errore fa riferimento a un bean Spring ... –

8

Uso sempre java.util.Date con le date di Oracle e gestisce correttamente data e ora.

+0

Questa è la risposta corretta. La risposta di Pascal all'utilizzo di una colonna di tipo TIMESTAMP è solo una soluzione. Se si è "obbligati" a utilizzare una colonna di tipo DATE (mappatura di Hibernate a uno schema esistente che non è possibile modificare), è necessario utilizzare java.util.Date e NON java.sql.Date.Ecco una domanda simile che copre questo caso: http://stackoverflow.com/questions/960923/mapping-an-oracle-date-to-a-java-object-using-hibernate –

+1

Non lo consiglierei. Quando si utilizza java.util.Date, Hibernate esegue il mapping al relativo TimestampType. Oracle potrebbe quindi eseguire il cast della colonna DATE su TIMESTAMP in modo da non utilizzare un indice esistente e le prestazioni saranno davvero pessime. Meglio usare un timestamp fino in fondo. –

2

Forse hai this problem? Assicurati di avere l'ultimo driver JDBC, il nome del file dovrebbe essere ojdbc5.jar.

0

è necessario utilizzare @type (type = "org.joda.time.contrib.hibernate.PersistentDateTime") per la colonna definita nella classe di entità