如何使用hibernate

时间:2017-01-19 13:51:13

标签: java sql-server hibernate date jodatime

使用hibernate和joda time在数据库中存储DateTime时,我遇到了奇怪的问题。

我有这样的豆:

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

1 个答案:

答案 0 :(得分:3)

这是因为zoda DateTime以UTC格式存储db中的日期,而LocalDateTime按日期存储日期,并且在您不关心时区时应该使用。

如果您需要考虑时区(日光节省等),则需要考虑日期时间,以此方式处理,并将日期存储在世界时。

请参阅此answer了解详细信息。