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?
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"/>
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>
  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  
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.
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 /
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);
}
}