Joda time DateTime stocke incorrectement dans la base de données

je stocke JodaTime DateTime dans la colonne timestamptz en utilisant org.jadira.usertype:usertype.jodatime:1.9 . App server dispose de + 4 fuseau horaire. Serveur de base de données +9 fuseau horaire. new DateTime() donne ${currentTime+1hour}+9 où +9 est le fuseau horaire (la valeur correcte est ${currentTime+5hours)+9 ).

je n'ai pas trouvé de sujets connexes. java.util.Date stocke correctement.

L'objet de domaine possède la propriété suivante:

static mapping = {
    dateCreated sqlType:'timestamptz'
}

Comment puis-je stocker DateTime correctement?

10
demandé sur Stefan Falk 2012-04-09 19:16:34

6 réponses

Juste mis JPA propriétés:

<property name="jadira.usertype.autoRegisterUserTypes"
          value="true"/>
<property name="jadira.usertype.databaseZone"
          value="jvm"/>
<property name="jadira.usertype.javaZone"
          value="jvm"/>
9
répondu Michal Z m u d a 2013-05-26 15:33:50

j'ai eu le même problème. La spécification des zones app et db dans config a résolu le problème.

            <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>
8
répondu Olja 2013-03-13 22:48:33

Ok. J'ai passé 8 heures pour résoudre le problème. Si vous utilisez usertype projet pour persister JodaTime, vous devez définir databaseZone propriété de PersistentDateTime classe égale au fuseau horaire actuel du serveur d'application (Pas de base de données!).

mais il est préférable d'utiliser soutien officiel d'hibernation . Il résout le problème de la boîte parce qu'il utilise java.utl.Date pour persister DateTime et java.util.Date correctement persisté par défaut

4
répondu fedor.belov 2012-04-12 07:43:14

essayez de lancer JVM avec-Duser.timezone=UTC à JAVA_OPTS de cette façon le temps est dans une zone et vous pouvez alors faire vos opérations là-dessus pour le convertir où que vous soyez.

1
répondu allthenutsandbolts 2012-04-11 03:50:41

Fedor,

ai-je raison de supposer que vous utilisez Oracle TIMESTAMP avec la colonne fuseau horaire? Usertype ne supporte pas encore ce type (i.e. avec TIME ZONE) en raison de la manipulation avec JDBC différente entre les bases de données, bien que le projet sera heureux d'accepter les correctifs.

il y a une bonne discussion sur Oracle ici: http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java /

0
répondu Chris Pheby 2012-04-15 07:11:55

j'avais résolu ces problèmes en créant D'autres PersistentDateTime extends 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);
}
}
0
répondu user2003295 2013-01-23 09:35:39