17 votes

Hibernate force l'horodatage à persister/charger en UTC

J'utilise java, mysql, hibernate (3.6.x). Du côté de java, j'utilise des objets java.sql.Timestamp. Du côté de mysql, j'utilise des colonnes datetime.

Je veux qu'Hibernate enregistre/charge ces objets Timestamp en utilisant le fuseau horaire UTC indépendamment du fuseau horaire du système/java/mysql.

J'ai trouvé " Comment stocker la date/heure et les horodatages dans le fuseau horaire UTC avec JPA et Hibernate ? "qui était instructif mais qui manquait d'informations sur la mise en œuvre finale, que j'ai du mal à trouver.

Je veux implémenter un UtcTimestampTypeDescriptor comme indiqué dans ce fil de discussion et configurer Hibernate pour qu'il l'utilise à la place du TimestampTypeDescriptor normal.

Comment puis-je configurer Hibernate pour qu'il utilise le type UtcTimestamp au lieu du type Timestamp par défaut ?

21voto

DanJ Points 708

Pour MySQL uniquement Dans le cas d'Hibernate, une alternative à l'implémentation de types Hibernate personnalisés consiste à ajouter les options JDBC suivantes à l'URL de connexion JDBC :

useTimezone=true
serverTimezone=UTC

Cela forcera votre connexion JDBC à utiliser le fuseau horaire UTC et demandera à MySQL d'effectuer les conversions à partir du fuseau horaire de la JVM. L'effet net est que vous pouvez conserver un fuseau horaire local sur votre JVM (par exemple pour l'impression des messages de journal, etc.), tandis que les colonnes DATETIME seront persistées en tant que UTC.

Par exemple :

<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>
            ...

3voto

Ilya Points 12449

Obtenir la classe public class UtcTimestampType extends TimestampType de votre lien
et faire ce code

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

l'utilisation d'annotations

ou

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

en utilisant *.hbm.xml

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X