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);
}
}