使用Hibernate和Joda Time将DateTime存储到数据库时,我遇到了奇怪的问题。
我有这样一个bean:
import org.joda.time.DateTime;
public class RelationshipEntity {
@Column(name = "date_revision")
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime dateRevision;
// other fields
}
我已经在应用程序中使用 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris"));
设置了时区为欧洲/巴黎(GMT+1)。
如果我将具有修订日期2017-01-19 13:24
的实体保存到数据库中,我可以看到数据库中的日期已设置为2017-01-19 12:24
,但我不明白为什么。
数据库时区似乎也是欧洲/巴黎,因为:
SELECT SYSDATETIME(); //2017-01-19 14:41
SELECT SYSUTCDATETIME(); // 2017-01-19 13:41
由于我使用spring-boot,我尝试在application.yml
中添加以下属性:
jadira.usertype.autoRegisterUserTypes: true
jadira.usertype.databaseZone: jvm
jadira.usertype.javaZone: jvm
需要使用参数-Duser.timezone=Europe/Paris
启动应用程序,但它仍将日期保存为UTC格式存储到数据库中。
为了解决这个问题,我将DateTime
更改为LocalDateTime
:
@Column(name = "date_revision")
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
private DateLocalTime dateRevision;
通过这个改变,数据库中的dateRevision与我在Java bean中设置的相同。
有人可以解释一下为什么使用org.joda.time.DateTime
类型时,它会将日期转换成UTC吗?
注意:我使用的是Hibernate 4和joda-time 2.5。