java - 如果应用程序使用不同于 MySQL 的时区,则 Hibernate 保存/检索日期减去天数

标签 java mysql hibernate spring-boot timezone

我在 MACHINE_A 上的 tomcat 上启动了一个应用程序,时区为 GMT+3。

我使用在 MACHINE_B 上启动的远程 MySQL 服务器,时区为 UTC。

我们使用 spring-data-jpa 进行持久化。

作为问题的一个例子,我将展示存储库:

public interface MyRepository extends JpaRepository<MyInstance, Long> {
    Optional<MyInstance> findByDate(LocalDate localDate);
}

如果我为 2018-09-06 传递 localDate,我会得到日期为 2018-09-05(前一天)的实体

在我看到的日志中:

2018-09-06 18:17:27.783 TRACE 13676 --- [nio-8080-exec-3] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [DATE] - [2018-09-06]

我用谷歌搜索了很多这个问题,发现了几篇内容相同的文章(例如 https://moelholm.com/2016/11/09/spring-boot-controlling-timezones-with-hibernate/ )

所以,我有以下 application.yml:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/MYDB?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
    username: root
    password: *****
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    properties:
      hibernate:
        show_sql: true
        use_sql_comments: true
        format_sql: true
        type: trace
        jdbc:
          time_zone: UTC

但这并没有帮助。

我们使用以下连接器:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.12</version>
</dependency>

如何解决我的问题?

附言

我尝试在同一时区运行这两个应用程序。在这种情况下,一切都按预期工作。

附言2

我尝试使用 MySQL 驱动程序 6.0.6 版本,但它没有任何改变。

最佳答案

如果您在 Java 中使用 LocalDate,则应该在 MySQL 中使用 DATE 列。这样问题就迎刃而解了。

如果您使用 LocalDateTime,请尝试在 Spring Boot 中设置如下属性:

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

要查看它的运行情况,您可以在我的 High-Performance Java Persistence GitHub repository 中找到一个测试用例它演示了此设置如何与 MySQL 一起使用。

关于java - 如果应用程序使用不同于 MySQL 的时区,则 Hibernate 保存/检索日期减去天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52207233/

相关文章:

php - 将表单值插入 Wordpress 数据库表 :php

mysql - 根据其他表中存在的匹配行创建列?

java - spring data save iterable方法是否使用批量操作并按相同顺序返回结果?

java - Hibernate 对 Select 执行删除

java - 问题: Jsoup to parse string with < followed by word

java - 运算符 < 不能应用于 java

java - 实体未找到异常 : Bean has been deleted - lazy loading failed

php - json编码的php数组在javascript中返回未定义

java - 在 Oracle View 中为 Hibernate 插入设置固定值

java - 如何从使用自定义对象的树集中删除重复项