2012-03-22 6 views
15

Sto utilizzando java, mysql, hibernate (3.6.x). Sul lato java sto usando gli oggetti java.sql.Timestamp. Sul lato mysql sto usando colonne datetime.Data/ora della forza di ibernazione per persistere/caricare come UTC

Voglio ibernare per salvare/caricare questi oggetti Timestamp utilizzando il fuso orario UTC indipendentemente dal fuso orario sistema/java/mysql.

Ho trovato "How to store date/time and timestamps in UTC time zone with JPA and Hibernate" che era informativo ma privo di alcune informazioni sull'implementazione finale che non riesco a trovare.

Desidero implementare un UtcTimestampTypeDescriptor come mostrato in quella discussione e configurare l'ibernazione per utilizzare questo invece del normale TimestampTypeDescriptor.

Come è possibile configurare la modalità di sospensione per utilizzare il tipo UtcTimestamp invece del tipo Timestamp predefinito?

+1

Perché non provare l'attuazione https://community.jboss.org/wiki/UserTypeForNon-defaultTimeZone e poi venire con domande specifiche. – ManuPK

+0

Non voglio implementare un semplice tipo utente e annotare ogni proprietà data/tiemstamp. Invece voglio implementare un descrittore e registrarlo in ibernazione invece del descrittore timstamp predefinito. La domanda specifica è dove registro questo tipo con l'ibernazione in modo da sostituire quello predefinito? – samz

+0

http://stackoverflow.com/questions/4725719/hibernate-typeresolver – samz

risposta

3

get classe public class UtcTimestampType extends TimestampType da your link
e rendere questo codice

@org.hibernate.annotations.Type(type = "yourPackage.UtcTimestampType") 
public java.util.Date date;  

utilizzando annotazioni

o

<property name="date" column="yourColumn" type="yourPackage.UtcTimestampType" /> 

utilizzando * .hbm.xml

+1

Non voglio annotare ogni proprietà data/timestamp che ho. Voglio che l'ibernazione usi sempre UTCTimestampType invece del tipo predefinito. – samz

+0

È impossibile. UTCTimestampType è un tipo di utente personalizzato. Se vuoi, puoi decomprimere la libreria di Hibernate e modificarla. – Ilya

+0

Guarda sotto quell'esempio, nell'esempio di ibernazione 3.6. C'è un esempio di un descrittore, non un tipo. Poi dice che all'avvio dell'app puoi registrare questo tipo invece di quello predefinito, ma non dice come/dove .. Questa è fondamentalmente la mia domanda. – samz

19

Un'alternativa implementazione personalizzata Hibernate tipi è quello di aggiungere le seguenti opzioni JDBC al tuo URL di connessione JDBC:

useTimezone=true 
serverTimezone=UTC 

Questo forzerà la vostra connessione JDBC nel fuso orario UTC e chiedere MySQL per eseguire le conversioni dal fuso orario JVM. L'effetto netto è che puoi mantenere un fuso orario locale sulla tua JVM (ad es. Per stampare i messaggi di log e così via), mentre le colonne DATETIME verranno mantenute come UTC.

Ad esempio:

<bean id="hibernateAnalysisSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="hibernateProperties"> 
     <props> 
      <!-- Connection parameters --> 
      <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop> 
      <prop key="hibernate.connection.url">jdbc:mysql://hostname/databaseName?useTimezone=true&amp;serverTimezone=UTC</prop> 
      ... 
+1

Grazie. Esso funziona magicamente. :) –

Problemi correlati