【发布时间】:2017-07-08 23:47:24
【问题描述】:
我有这两个课
class Source {
// mapped to TIMESTAMP
@Version
@Column(columnDefinition="TIMESTAMP(3) DEFAULT '2016-01-01'")
Instant myInstant;
}
class Destination {
// mapped to DATETIME
@Basic(optional=true)
Instant myInstant;
}
使用 Hibernate 时,我分配
destination.myInstant = source.myInstant;
然后存储的值比原始值小一小时 - 根据命令行 MySQL 客户端和 Java。我现在的时区是UTC+1,所以原因很明显是时区转换。
有几个地方可以解决此问题,但我正在寻找最佳做法。服务器应该在全球范围内工作,所以它应该继续在内部使用 UTC,对吧?
我应该将列类型更改为TIMESTAMP 吗?那么,为什么Instant默认映射到DATETIME呢?
根据this article,Instant 确实映射到TIMESTAMP,但在我的情况下它没有。为什么?
【问题讨论】:
-
请提供
SHOW CREATE TABLE和从Hibernate生成的SQL。 -
@RickJames 没有什么有趣的地方:
SHOW CREATE TABLE显示了像timestamp(3) NOT NULL DEFAULT '2016-01-01 01:00:00.000和datetime这样的类型。这些语句只是简单的选择和更新,没有背后的逻辑。这些值没有被记录。无论如何我都会发布日志,但我必须用我的问题中使用的那些替换真实的类和字段名称,这是不值得的,因为那里真的什么都没有。 -
SHOW VARIABLES LIKE '%zone%'; -
@RickJames
system_time_zone = UTC,time_zone = SYSTEM. -
但是你说“我当前的时区是 UTC+1”——这是从哪里来的?
标签: java mysql hibernate datetime