当我使用JPA保存实体时,mysql中的时间发生了变化

问题描述 投票:0回答:1

JPA 版本:

<groupId>org.springframework.boot</groupId>  
<artifactId>spring-boot-starter-data-jpa</artifactId>  
<version>3.2.1</version>

@PersistenceContext
EntityManager entityManager;

Session session = this.entityManager.unwrap(Session.class);
session.save(user)

数据类型为 ZonedDateTime

@Column(name = "CREATE_TIME")
private ZonedDateTime createTime;

当我调试时,我发现时间是正确的,但是当我调用save时,它在数据库中存在的时间比我在调试中看到的时间少了八个小时。我反复检查数据库时间,确认数据库时间是和我的服务器时间一致,时区也一致(都是上海时区)

这个事件让我感受到JPA是否会自动将时间转换为UTC时间并插入到DB中

hibernate jpa spring-data-jpa
1个回答
0
投票

我不确定问题是什么,但我认为你很好地分析了情况:

这个事件让我感受到JPA是否会自动将时间转换为UTC时间并插入到DB中

我认为除了完全拒绝

ZonedDateTime
之外,这是合理的做法。 A
ZonedDateTime
基本上是一个时间点加上时区。

此类存储所有日期和时间字段(精确到纳秒)和时区,以及用于处理不明确的本地日期时间的区域偏移量 https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html

数据库通常无法存储时区信息,因此为了至少保留时间点信息,将其转换为 UTC 是有意义的。

当然,这留下了一个问题:再次加载数据时将使用哪个时区。我想它将使用您(即您的应用程序服务器)本地时区,这可能是也可能不是您想要的。

如果这种行为对你有效,那么你很幸运。 如果没有,请使用没有时区但也不是时间点的

LocalDateTime
。这意味着如果
LocalDateTime
跨时区共享,它就失去了所有意义。不要让我开始使用夏令时。 或者使用
Instant
,它实际上是一个时间点,使用 UTC 时区表示。 您的时区信息应放入数据库中的单独字段中。再次确保正确处理夏令时。

如果你真的想让一切都正确并且你的大脑受到伤害,请考虑时区定义可能会随着时间的推移而改变。

© www.soinside.com 2019 - 2024. All rights reserved.