2012-04-09 21 views
10

Estoy almacenando el campo JodaTime DateTime en la columna timestamptz usando org.jadira.usertype:usertype.jodatime:1.9. El servidor de aplicaciones tiene +4 zona horaria. Servidor de base +9 zona horaria. new DateTime() resultados en ${currentTime+1hour}+9 donde +9 es zona horaria (el valor correcto es ${currentTime+5hours)+9).Joda time DateTime almacena incorrectamente en la base de datos

No he encontrado ningún tema relacionado. java.util.Date almacena correctamente.

objeto Dominio tiene la siguiente propiedad de asignación:

static mapping = { 
    dateCreated sqlType:'timestamptz' 
} 

¿Cómo puedo almacenar DateTime correctamente?

Respuesta

4

Ok. He gastado 8 horas para resolver el problema. Si está utilizando el proyecto usertype para conservar JodaTime, debe configurar databaseZone propiedad de PersistentDateTime clase igual a la zona horaria actual del servidor de aplicaciones (¡no a la base de datos!).

Pero es mejor usar official hibernate support. Resuelve el problema de la caja, ya que utiliza java.utl.Date persistir DateTime y java.util.Date correctamente persistido por defecto

+9

El soporte oficial de hibernación no se extiende a Hibernate 4.0. :-(para el que necesita usar usertype. –

0

Intente iniciar JVM con -Duser.timezone = UTC en JAVA_OPTS de esta forma, la hora está en una zona y puede hacer sus operaciones para convertirla donde quiera que esté.

+0

Esa es una gran manera de ir - pero se advirtió que no se puede hacer eso si ya tiene fechas almacenadas en otra zona horaria en el PP. En otras palabras, no hay problema para los nuevos proyectos, pero tenga mucho cuidado de hacerlo con los que ya tienen datos. – RedYeti

0

Fedor,

Estoy en lo cierto al suponer que usted está utilizando Oracle TIMESTAMP WITH TIME ZONE columna? Usertype aún no es compatible con este tipo (es decir, con HUSO HORARIO) debido al manejo con JDBC que difiere entre las bases de datos, aunque el proyecto aceptará con gusto los parches.

Hay un poco de buena discusión WRT Oracle aquí: http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java/

+0

estamos usando el timestamptz de PostgreSQL –

0

había resuelto este problema mediante la creación de otra PersistentDateTime extiende AbstractVersionableUserType.

import java.sql.Timestamp; 

import org.hibernate.SessionFactory; 
import org.hibernate.usertype.ParameterizedType; 
import org.jadira.usertype.dateandtime.joda.columnmapper.TimestampColumnDateTimeMapper; 
import org.jadira.usertype.spi.shared.AbstractVersionableUserType; 
import org.jadira.usertype.spi.shared.IntegratorConfiguredType; 
import org.joda.time.DateTime; 

public class PersistentDateTime extends AbstractVersionableUserType<DateTime, Timestamp, TimestampColumnDateTimeMapper> implements ParameterizedType, IntegratorConfiguredType { 

@Override 
public int compare(Object o1, Object o2) { 
    return ((DateTime) o1).compareTo((DateTime) o2); 
} 

@Override 
public void applyConfiguration(SessionFactory sessionFactory) { 

    super.applyConfiguration(sessionFactory); 

    TimestampColumnDateTimeMapper columnMapper = (TimestampColumnDateTimeMapper) getColumnMapper(); 
    columnMapper.setDatabaseZone(null); 
    columnMapper.setJavaZone(null); 
} 
} 
8

Tuve el mismo problema. Especificar aplicaciones y zonas db en config resolvió el problema.

  <prop key="jadira.usertype.autoRegisterUserTypes">true</prop> 
      <prop key="jadira.usertype.databaseZone">America/Los_Angeles</prop> 
      <prop key="jadira.usertype.javaZone">America/Los_Angeles</prop> 
+1

Este funciona para Hibernate 4+ – Sudarshan

+1

¿A qué archivo va esto? – dgrant

9

acaba de establecer las propiedades de la APP:

<property name="jadira.usertype.autoRegisterUserTypes" 
      value="true"/> 
<property name="jadira.usertype.databaseZone" 
      value="jvm"/> 
<property name="jadira.usertype.javaZone" 
      value="jvm"/> 
+1

¿Qué archivo va? – dgrant

+0

@dgrant en su archivo persistence.xml – Hamish

+0

¿Hay alguna manera de hacerlo sin un archivo XML? Mi proyecto está usando anotaciones puras para la configuración hasta el momento ... – Jules

Cuestiones relacionadas