2012-03-22 11 views
15

Estoy usando java, mysql, hibernate (3.6.x). En el lado java estoy usando objetos java.sql.Timestamp. En el lado de mysql estoy usando columnas de fecha y hora.Hibernate force timestamp para persistir/cargar como UTC

Quiero hibernar para guardar/cargar estos objetos Timestamp utilizando la zona horaria UTC independientemente del huso horario del sistema/java/mysql.

Encontré "How to store date/time and timestamps in UTC time zone with JPA and Hibernate" que fue informativo pero me faltaba algo de información de implementación final que estoy luchando por encontrar.

Quiero implementar UtcTimestampTypeDescriptor como se muestra en ese hilo y configurar hibernate para usar esto en lugar del TimestampTypeDescriptor normal.

¿Cómo puedo configurar hibernate para usar el tipo UtcTimestamp en lugar del tipo Timestamp predeterminado?

+1

Por qué no pruebas a implementar https://community.jboss.org/wiki/UserTypeForNon-defaultTimeZone y luego llegar a las preguntas específicas. – ManuPK

+0

No quiero implementar un simple usertype y anotar cada fecha/propiedad tiemstamp. En su lugar, quiero implementar un descriptor y registrarlo en hibernación en lugar del descriptor timstamp predeterminado. La pregunta específica es: ¿dónde puedo registrar este tipo con Hibernate para que reemplace al predeterminado? – samz

+0

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

Respuesta

3

clase get public class UtcTimestampType extends TimestampType de your link
y hacer que el código

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

utilizando anotaciones

o

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

usando * .hbm.xml

+1

No quiero anotar cada fecha/propiedad de sello de tiempo que tengo. Quiero que hibernate siempre use UTCTimestampType en lugar del tipo predeterminado. – samz

+0

Es imposible. UTCTimestampType es un tipo de usuario personalizado. Si lo desea, puede descomprimir la biblioteca de Hibernate y piratearla. – Ilya

+0

Mire en ese ejemplo, en el ejemplo de hibernate 3.6. Hay un ejemplo de un descriptor, no un tipo. Luego dice que cuando se inicia la aplicación puede registrar este tipo en lugar del predeterminado, pero no dice cómo/dónde ... Esa es básicamente mi pregunta. – samz

19

Una alternativa a implementación personalizada tipos de Hibernate es agregar las siguientes opciones a su JDBC URL de conexión JDBC:

useTimezone=true 
serverTimezone=UTC 

Esto obligará a su conexión JDBC en la zona UTC y pedir MySQL para realizar conversiones desde la zona horaria JVM. El efecto neto es que puede mantener una zona horaria local en su JVM (por ejemplo, para imprimir mensajes de registro, etc.), mientras que las columnas DATETIME persistirán como UTC.

Por ejemplo:

<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

Gracias. Funciona a las mil maravillas. :) –

Cuestiones relacionadas