4

我在 Hibernate 4 中使用 jadira 用户类型作为 joda 时间。我需要使用 jvm 日期时间进行存储和检索。问题是回读的日期有 2 小时的偏移量。我们在 UTC+2。日期正确地存储在数据库中。数据库是 MySQL 5。我在会话工厂配置中全局设置 databaseZone 和 javaZone,如下所示:

<prop key="jadira.usertype.autoRegisterUserTypes">true</prop>
<prop key="jadira.usertype.databaseZone">jvm</prop>
<prop key="jadira.usertype.javaZone">jvm</prop>  

数据库本身配置为时区 SAST。以上述配置为例,数据库中存储的日期为 2008-01-01,读取为 2007-12-31T22:00:00.000+02:00。我也尝试过没有使用注释的全局配置,如下所示,但结果相同:

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime",
parameters = { @Parameter(name = "databaseZone", value = "jvm"),
         @Parameter(name = "javaZone", value = "jvm")})

如果我在数据库上运行以下查询,

SELECT version( ) , @@time_zone , @@system_time_zone , NOW( ) , UTC_TIMESTAMP( );

我得到结果:

version : 5.5.13
@@time_zone :  SYSTEM
@@system_time_zone  : South Africa Standard Time
NOW() : 2013-04-03 14:33:12
UCT_TIMESTAMP() : 2013-04-03 12:33:12

我在这里想念什么。根据我从 usertype 和 joda 了解到的所有信息,我的配置是正确的。

4

1 回答 1

0

我设法解决了这个问题。它是由于 MySQL 驱动程序中的错误而发生的。这是一个链接!我将驱动程序升级到版本 mysql-connector-java-6.1.6。因为我使用 databaseZone="jvm",所以我必须通过在数据库属性中使用 serverTimezone=UTC 来强制数据库为 UTC。您还必须使用属性 setLegacyDatetimeCode=false 才能使错误修复生效

于 2013-04-08T13:25:50.537 回答