web-dev-qa-db-fra.com

hibernate + date du magasin d’initialisation du printemps sur les problèmes de fuseau horaire UTC

Je fais quelques tests pour définir UTC comme fuseau horaire par défaut pour mon application. Tout d’abord, je veux que mes valeurs datetime soient stockées avec l’UTC.

Selon VLAD MIHALCEA ( https://vladmihalcea.com/how-to-store-date-time-and-timestamps-in-utc-time-zone-with-jdbc-and-hibernate/ ) et https://moelholm.com/2016/11/09/spring-boot-controlling-timezones-with-hibernate/ J'ai défini dans mon fichier de propriétés:

spring.jpa.properties.hibernate.jdbc.time_zone= UTC

Pour tester, j'utilise une base de données h2, j'ai créé un exemple d'entité avec tout le type dateTime Java 8.

Dans ma configuration liquibase, ils sont définis comme suit:

<column name="instant" type="timestamp"/>
<column name="local_date" type="date"/>
<column name="local_time" type="time"/>
<column name="offset_time" type="time"/>
<column name="local_date_time" type="timestamp"/>
<column name="offset_date_time" type="timestamp"/>
<column name="zoned_date_time" type="timestamp"/>

Je pense que j'utilise le bon type pour tous les champs. Cela fonctionne pour tous les champs sauf "local_time" "offset_time" qui sont des types Time SQL pas timestamp.

 enter image description here

Comme vous pouvez le constater, j'ai ajouté cette ligne à 8h39 (Paris GMT + 2) et les horodatages ont la bonne valeur UTC (06h38). MAIS "heure locale" et "heure_offensive" ont une valeur étrange ( 7h39).

Je me demande pourquoi ce comportement, si certains d’entre vous ont une idée de la raison pour laquelle mes deux champs temporels ne stockent pas les valeurs correctement.

PS: version:

  • Hibernate: 5.2.17.Final
  • Botte de printemps: 2.0.4.LELEASE

Mon exemple d'entité utilise pour insérer des données:

import javax.persistence.*;
import Java.io.Serializable;
import Java.time.*;
import Java.util.Objects;

@Entity
@Table(name = "avdev_myData")
public class MyData implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "instant")
    private Instant instant;

    @Column(name = "local_date")
    private LocalDate localDate;

    @Column(name = "local_time")
    private LocalTime localTime;

    @Column(name = "offset_time")
    private OffsetTime offsetTime;

    @Column(name = "local_date_time")
    private LocalDateTime localDateTime;

    @Column(name = "offset_date_time")
    private OffsetDateTime offsetDateTime;

    @Column(name = "zoned_date_time")
    private ZonedDateTime zonedDateTime;
3
Avdev4j

J'ai ouvert un problème dans le traqueur de bugs Hibernate et j'ai eu une réponse à mon problème.

Pour LocalTime, la transformation est relative au 1er janvier 1970, pas le jour où j'ai effectué le test. Donc, l'heure d'été n'est pas gérée.

Selon Vlad Mihalcea, nous devons utiliser LocalDateTime à la place, car nous connaissons la date et bien sûr, si la période est ou non.

il y a toute la réponse ici: https://hibernate.atlassian.net/browse/HHH-12988?focusedCommentId=103750&page=com.atlassian.jira.plugin.system.issuetabpanels%3A3. comment-103750

cordialement

1
Avdev4j

Essaye:

@SpringBootApplication
public class YourApplication {

    @PostConstruct
    void started() {
        // set JVM timezone as UTC
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}
1
Bendy Zhang

Dans le cas où décider d'utiliser MySQL dans mon cas fonctionne correctement avec

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL57InnoDBDialect

spring.datasource.url = jdbc: mysql: // DBHOST: 3306/DBNAME? useLegacyDatetimeCode = false & serverTimezone = UTC

0
Petko Mirchev