JPA 保存后 MySQL 日期更改为昨天的日期

在使用 Spring 的 JpaRepository 将实体保存到 MySQL 时,我遇到了日期字段/数据库列的问题。

该实体具有 LocalDate 字段。在使用 LocalDate.now() 进行测试时,遇到了返回 Date 字段的问题:

  1. 首先保存返回对象的日期是否正确。

  2. 从 MySQL 数据库返回对象时,日期是前一天

例子:

预计:2019-01-29

实际:2019-01-28

我昨天试过了,结果是:

预计:2019-01-28

实际:2019-01-27

可能类似于 this JPA Saving wrong date in MySQL database

代码

应用程序-mysql-test-connection.properties


spring.jpa.hibernate.ddl-auto=create


# Database url

spring.datasource.url=jdbc:mysql://localhost:3306/test_coupon_system?serverTimezone=UTC


spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver


# Test Database credentials

spring.datasource.username=springuser

spring.datasource.password=springuser


### showing values - for development

spring.jpa.show-sql=true

为简洁起见,优惠券删除了构造函数和 getter/setter


@Entity

public class Coupon {


    @Id

    @GeneratedValue(strategy = GenerationType.AUTO)

    @Column(name = "id", length = 45)

    private long id;



    @Column(name = "name", unique = true, nullable = false, length = 45)

    private String name;


    @Column(name = "description", length = 100)

    private String description;


    @Column(name = "imageLocation")

    private String imageLocation;


    @Column(name = "startDate", length = 45)

    private LocalDate startDate;


    @Column(name = "endDate", length = 45)

    private LocalDate endDate;


    @ManyToOne(cascade = CascadeType.PERSIST)

    @JoinColumn(name = "company_id")

    private Company company;


    @ManyToMany(cascade = CascadeType.PERSIST,fetch = FetchType.EAGER)

    @JoinTable(

            name = "customer_coupon",

            joinColumns = @JoinColumn(name = "coupon_id"),

            inverseJoinColumns = @JoinColumn(name = "customer_id")

    )

    private List<Customer> customers;


DIEA
浏览 126回答 3
3回答

侃侃尔雅

例如,如果您的时区是Europe/Warsaw你可以设置:spring.datasource.url=jdbc:mysql://localhost:3306/database?serverTimezone=Europe/Warsaw而不是这个:spring.datasource.url=jdbc:mysql://localhost:3306/database?serverTimezone=UTC但您也可以在 application.properties 中再添加一项:spring.jpa.properties.hibernate.jdbc.time_zone=Europe/Warsaw

繁花如伊

谢谢你的帮助。如上所述并回答,这是一个时区问题。解决方案:在 MySQL 中设置SET GLOBAL time_zone = '+02:00';";?serverTimezone=UTC从中删除spring.datasource.url=jdbc:mysql://localhost:3306/schema_name发现这些 MySQL 命令很有用:&nbsp;SELECT @@GLOBAL.time_zone, @@session.time_zone, @@system_time_zone;和&nbsp;SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;附加信息MySQL 是否应将其时区设置为 UTC?在MySQL 文档中。解决方法如上所述,更改pom.xmlmysql-connector-java中的 Spring Boot 默认值:<dependency>&nbsp;<groupId>mysql</groupId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <artifactId>mysql-connector-java</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <version>5.1.47</></dependency>属性spring.datasource.driverClassName=com.mysql.jdbc.Driver文件中的驱动程序也返回了正确的日期。

慕田峪9158850

我认为这是因为时区问题。区域设置日期不考虑您已经知道的时区。但在数据库中,我猜日期与时区相关联。JPA/Hibernate 层会将 LocaleDate 转换为 TimeStamp(默认在转换过程中将使用 JVM 时区)。您运行应用程序的时区与数据库时区不同,因此存在不匹配。要确认这一点,请将运行机器的时区设置为 UTC。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java