Пружинная загрузка JPA с MySql DB - отображение Даты заканчиваются тем, что был неправильный день (1 выходной) - PullRequest
0 голосов
/ 24 февраля 2020

В настоящее время я сталкиваюсь со странной проблемой с Spring JPA: всякий раз, когда я пытаюсь отобразить дату только как Дата, она сохраняет день, который я хочу сохранить, минус 1 день. Например, сохранение 1 февраля -> У меня есть 31 января в моей БД. Пока я использую DateTime, все в порядке. Пример: MySQL для часового пояса, установленного в System System, установлено UT C + 1 в URL-адресе подключения, для serverTimeZone установлено значение UT C и useLegacyDatetimeCode = true

@Entity
public class ZoneEntity
{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @CreationTimestamp
    private LocalDateTime createDateTime;

    @CreationTimestamp
    private LocalDate createDate;

    @Temporal(value = TemporalType.TIMESTAMP)
    private Date temporalDate;

    private LocalDateTime localDateTime;

    private LocalDate localDate;

    @Column(columnDefinition = "DATE")
    private LocalDate localDateWithColumn;

    public ZoneEntity() {
        temporalDate = new Date();
        localDateTime = LocalDateTime.now();
        localDate = LocalDate.now();
        localDateWithColumn = LocalDate.now();
    }

Затем я сохраню новая сущность, подобная этой:

service.save(new ZoneEntity());

Если я выполню это сегодня (24.02.2020), я получу следующее

createDateTime : 24.02.2020 15:20:00  --> Correct (UTC)

createDate : 23.02.2020 --> day - -1

temporalDate : 24.02.2020 15:20:00 --> Correct (UTC)

localDate : 23.02.2020 --> day - 1

localDateTime : 24.02.2020 15:20:00 --> Correct (UTC)

localDateWithColumn : 23.02.2020 --> day - 1

Поэтому, однако, я сохраняю только дату, это заканчивается не в тот день. У кого-нибудь есть идеи, почему это происходит?

добавлено:

Если я посмотрю в журнале гибернации, проблема, кажется, на стороне MySQL ...

Hibernate: 
    insert 
    into
        zone_entity
        (create_date, create_date_time, local_date, local_date_time, local_date_with_column, temporal_date, id) 
    values
        (?, ?, ?, ?, ?, ?, ?)
2020-02-24 16:42:25.371 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [DATE] - [2020-02-24]
2020-02-24 16:42:25.374 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [TIMESTAMP] - [2020-02-24T16:42:25.365036900]
2020-02-24 16:42:25.375 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [DATE] - [2020-02-24]
2020-02-24 16:42:25.375 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [4] as [TIMESTAMP] - [2020-02-24T16:42:25.302181]
2020-02-24 16:42:25.375 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [5] as [DATE] - [2020-02-24]
2020-02-24 16:42:25.376 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [6] as [TIMESTAMP] - [Mon Feb 24 16:42:25 CET 2020]
2020-02-24 16:42:25.376 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [7] as [BIGINT] - [294]

добавлено: если я пытаюсь вставить через MySQL верстак со значениями ниже (как выглядят параметры из Hibernate), все будет в порядке (оставив метку времени, чтобы сделать ее немного короче).

insert 
    into
        zone_entity
        (create_date, create_date_time, local_date, local_date_time, local_date_with_column,id) 
    values
        ('2020-02-24', '2020-02-24T22:03:13.842324', '2020-02-24', '2020-02-24T22:03:13.842324', '2020-02-24',99);

добавлено : теперь я изменил часовой пояс в URL БД на Европу / Лондон -> все работает как надо. Переключение на UT C или Европа / Лондон -> оба не работают!

spring.datasource.url = jdbc:mysql://localhost:3306/myDatabase?serverTimezone=Europe/Berlin&useLegacyDatetimeCode=false

Заранее большое спасибо!

С уважением

Joern

...