【发布时间】:2021-07-07 22:49:56
【问题描述】:
-
我认为众所周知,MySQL 中的
timestamp列类型旨在及时存储“时刻”。 -
根据LocalDateTime official docs,这个类是:
在 ISO-8601 日历系统中没有时区的日期时间,例如 如 2007-12-03T10:15:30。 LocalDateTime 是一个不可变的日期时间对象 表示日期时间,通常被视为 年月日时分秒
并且通常用于存储带时间的日期,而不是“时刻”(它不像Instant等其他“时刻”数据类型那样使用UTC作为参考存储)。
那么为什么 Hibernate 将 LocalDateTime 字段映射到数据库中的 timestamp 字段呢?据我了解,它们用于不同的事物!
这给我带来了问题,我想在我的数据库中存储原始 LocalDateTime 值,但是 Hibernate 通过在内部首先将我的所有数据库 datetimes 转换为“moments”(特别是 java.sql.Timestamp)破坏了这一点
这是一个错误吗?设计缺陷?还是我错了?
顺便说一句,我已经尝试过像这样设置我的实体
public class MyEntity implements Serializable {
@Id
private Long id;
@Column(name = "my_date_time_field", columnDefinition = "DATETIME")
private LocalDateTime myDateTimeField = LocalDateTime.now();
并且 Hibernate 在从数据库中获取时仍然会进行一些 awkard 转换,因为它认为我正在获取“时刻”而不是“本地日期/时间”值(内部仍然使用 TimestampTypeDescriptor,它转换为 @987654332 @ 在做任何其他事情之前)。
PD:我知道以 UTC 格式处理所有日期/时间是标准做法。由于客户的要求,我不能这样做。他们只想查看数据库中的本地日期和时间,并且永远不会看到它们被转换,即使它们位于不同的时区。他们明确告诉我他们不关心“时刻”的概念,因为他们的业务并没有像那样根本运作(经过数周的解释和争论,我很确定他们知道会带来什么后果)。
【问题讨论】:
-
根据documentation
timestamp类型是:“TIMESTAMP数据类型用于同时包含日期和时间部分的值。TIMESTAMP的范围是'1970-01-01 00 :00:01' UTC 到 '2038-01-19 03:14:07' UTC。"。你的意思是time类型吗? -
这会导致什么具体问题?即“我存储 X,然后我返回 Y 而不是 Z”(给定特定的客户端和服务器时区)
-
在我使用 Hibernate(以及 EJB)的地方,我们总是明确定义数据库表,而不是让它们自动创建。
-
我认为 Hibernate 没有理由这样做。您使用的是哪个版本以及哪种方言?
标签: java mysql spring hibernate java-time