为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

DIEA 2022-05-25 10:46:27
在使用 Spring 的 JpaRepository 将实体保存到 MySQL 时,我遇到了日期字段/数据库列的问题。该实体具有 LocalDate 字段。在使用 LocalDate.now() 进行测试时,遇到了返回 Date 字段的问题:首先保存返回对象的日期是否正确。从 MySQL 数据库返回对象时,日期是前一天例子:预计:2019-01-29实际:2019-01-28我昨天试过了,结果是:预计:2019-01-28实际:2019-01-27可能类似于 this JPA Saving wrong date in MySQL database代码应用程序-mysql-test-connection.propertiesspring.jpa.hibernate.ddl-auto=create# Database urlspring.datasource.url=jdbc:mysql://localhost:3306/test_coupon_system?serverTimezone=UTCspring.datasource.driverClassName=com.mysql.cj.jdbc.Driver# Test Database credentialsspring.datasource.username=springuserspring.datasource.password=springuser### showing values - for developmentspring.jpa.show-sql=true为简洁起见,优惠券删除了构造函数和 getter/setter@Entitypublic 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;
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

例如,如果您的时区是

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


查看完整回答
反对 回复 2022-05-25
?
繁花如伊

TA贡献2012条经验 获得超12个赞

谢谢你的帮助。如上所述并回答,这是一个时区问题

解决方案:

  1. 在 MySQL 中设置SET GLOBAL time_zone = '+02:00';";

  2. ?serverTimezone=UTC从中删除spring.datasource.url=jdbc:mysql://localhost:3306/schema_name

发现这些 MySQL 命令很有用: SELECT @@GLOBAL.time_zone, @@session.time_zone, @@system_time_zone;和 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

附加信息MySQL 是否应将其时区设置为 UTC?MySQL 文档中。

解决方法

如上所述,更改pom.xmlmysql-connector-java中的 Spring Boot 默认值:

<dependency>

 <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>5.1.47</>

</dependency>

属性spring.datasource.driverClassName=com.mysql.jdbc.Driver文件中的驱动程序也返回了正确的日期。


查看完整回答
反对 回复 2022-05-25
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

我认为这是因为时区问题。区域设置日期不考虑您已经知道的时区。但在数据库中,我猜日期与时区相关联。JPA/Hibernate 层会将 LocaleDate 转换为 TimeStamp(默认在转换过程中将使用 JVM 时区)。您运行应用程序的时区与数据库时区不同,因此存在不匹配。

要确认这一点,请将运行机器的时区设置为 UTC。


查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信