![](/img/trans.png)
[英]Java 8 + Hibernate 5 MySQL TIMESTAMP/DATETIME to LocalDateTime Mapping
[英]Copying TIMESTAMP to DATETIME on MySQL with Hibernate
我有这两个班
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;
然后存储的值比原始值小1小时 - 根据命令行MySQL客户端和Java。 我当前的时区是UTC + 1,所以原因显然是时区转换。
有几个地方可以修复,但我正在寻找最好的做法。 服务器应该在全球范围内工作,所以它应该继续在内部使用UTC,对吧?
我应该只将列类型更改为TIMESTAMP
吗? 那么,为什么Instant
默认映射到DATETIME
?
根据这篇文章 , Instant
会映射到TIMESTAMP
,但在我的情况下却没有。 为什么?
如果你想使用时区和Java 8,我建议使用ZonedDateTime或OffsetTimeZone (后者在使用Hibernate时更喜欢)。 对于旧版本,请使用日历。
我希望其中一些有用。 以下是我在其中一个项目中的表现。
@Column(name = "registration_time")
private OffsetDateTime registrationTime;
[...]
subscriber.setRegistrationTime(OffsetDateTime.now());
在MySQL 5及以上版本中,TIMESTAMP值从当前时区转换为UTC以进行存储,并从UTC转换回当前时区以进行检索。 这仅适用于TIMESTAMP数据类型,但不适用于DATETIME。 这是您在将TIMESTAMP分配给DATETIME时看到差异的原因。 因此,同时使用相同类型的列应该可行。 默认情况下,Hibernate将InstantType映射到数据库TIMESTAMP类型。 虽然您可以在MYSQL中将它用于TIMESTAMP和DATETIME,但它们的处理方式不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.