4

Hibernate 4 で joda 時間に jadira ユーザータイプを使用しています。保存と取得には 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

ここで何が欠けていますか。ユーザータイプと 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 に答える