web-dev-qa-db-ja.com

HibernateはタイムスタンプをUTCとして永続化/ロードするように強制します

私はJava、mysql、hibernate(3.6.x)を使用しています。 Java側では、Java.sql.Timestampオブジェクトを使用しています。mysql側では、datetime列を使用しています。

システム/ Java/mysqlのタイムゾーンに関係なく、UTCタイムゾーンを使用してこれらのタイムスタンプオブジェクトをhibernateに保存/ロードさせたい。

JPAとHibernateを使用してUTCタイムゾーンで日付/時刻とタイムスタンプを保存する方法 」を見つけました。これは有益でしたが、見つけるのに苦労している最終的な実装情報が不足しています。

そのスレッドに示されているようにUtcTimestampTypeDescriptorを実装し、通常のTimestampTypeDescriptorの代わりにこれを使用するようにhibernateを構成したいと思います。

デフォルトのタイムスタンプタイプの代わりにUtcTimestampタイプを使用するようにHibernateを構成するにはどうすればよいですか?

17
samz

MySQLの場合のみ、カスタムHibernateタイプを実装する代わりに、JDBC接続URLに次のJDBCオプションを追加することもできます。

useTimezone=true
serverTimezone=UTC

これにより、JDBC接続がUTCタイムゾーンに強制され、MySQLにJVMタイムゾーンからの変換を実行するように要求されます。正味の効果は、JVMでローカルタイムゾーンを維持できることです(たとえば、ログメッセージの印刷など)が、DATETIME列はUTCとして保持されます。

例えば:

<bean id="hibernateAnalysisSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <!-- Connection parameters -->
            <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <prop key="hibernate.connection.url">jdbc:mysql://hostname/databaseName?useTimezone=true&amp;serverTimezone=UTC</prop>
            ...
19
DanJ

クラスを取得するpublic class UtcTimestampType extends TimestampType from あなたのリンク
そしてこのコードを作成します

@org.hibernate.annotations.Type(type = "yourPackage.UtcTimestampType")   
public Java.util.Date date;    

注釈を使用する

または

<property name="date" column="yourColumn" type="yourPackage.UtcTimestampType" />  

* .hbm.xmlを使用する

3
Ilya