gpt4 book ai didi

java - MySQL/Hibernate 使用映射为 LocalTime 的列检索错误数据

转载 作者:行者123 更新时间:2023-11-29 15:30:14 24 4
gpt4 key购买 nike

我正在 Hibernate (5.4.6.Final) 中将 MySQL 数据库的 TIME 列映射为 java.time.LocalTime 类。这是映射到实体的声明:

@Column(name = "TIMEVAL")
public LocalTime TIMEVAL;

数据库中的列的值为 00:30:00,但是 Hibernate 正在构建值为 01:30:00 的 TIMEVAL 实例
我考虑了服务器和 hibernate 连接之间的时区差异(忽略 TIME 数据类型没有时区的事实),但我将每个连接和服务器设置为 UTC。
并通过执行查询:

SELECT @@global.time_zone;
SELECT @@session.time_zone;

Hibernate session 和服务器的结果都是+00:00
按照 Hibernate 配置:

spring.jpa.properties.hibernate.jdbc.time_zone=UTC
spring.datasource.url=jdbc:mysql://localhost:3306/..?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowMultiQueries=true

这是 MySQL 配置:

default-time-zone=+00:00

我也尝试过:

  1. 将 MySQL 列指定为 VARCHAR(8),但 Hibernate 始终检索 01:30:00
  2. 将实体数据类型更改为 Duration,但 Hibernate 抛出错误,指出它无法将 TIME 映射到 java.lang.Long。

为了让 Hibernate 使用数据库列的值构建 LocalTime 实例,我需要修改什么?

最佳答案

正如@Andreas 在评论中指出的那样。 JVM 时区不是 UTC。
我需要更改 JVM 时区才能从数据库中获取正确的值。
因此,通过将以下参数添加到 JVM 选项:

-Duser.timezone=UTC

最后,使用 00:30:00 的值作为数据库列的值构建 LocalTime 实例。

关于java - MySQL/Hibernate 使用映射为 LocalTime 的列检索错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58787490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com