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 から私が理解していることによると、私の構成は正しいです。