2012-03-22 4 views
15

私はjava、mysql、hibernate(3.6.x)を使用しています。 Java側ではjava.sql.Timestampオブジェクトを使用しています。 mysql側では、datetimeカラムを使用しています。UTCとして持続/ロードするためのHibernate forceタイムスタンプ

システム/ java/mysqlのタイムゾーンに関係なく、これらのタイムスタンプオブジェクトをUTCタイムゾーンを使用して保存/ロードすることを欲しいです。

How to store date/time and timestamps in UTC time zone with JPA and Hibernate」は参考になりましたが、私が見つけるのに苦労している実装情報がありませんでした。

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

デフォルトのタイムスタンプタイプの代わりにUtcTimestampタイプを使用するように休止状態を設定するにはどうすればよいですか?

+1

は、なぜあなたはhttps://community.jboss.org/wiki/UserTypeForNon-defaultTimeZoneを実装しようとし、その後、具体的な質問を思い付くしていません。 – ManuPK

+0

単純なユーザータイプを実装し、すべての日付/ tiemstampプロパティに注釈を付けることは望ましくありません。代わりに、Descriptorを実装して、デフォルトのtimstamp記述子の代わりにhibernateに登録したいと思っています。具体的な質問は、このタイプをhibernateに登録してデフォルトのものを置き換える場所です。 – samz

+0

http://stackoverflow.com/questions/4725719/hibernate-typeresolver – samz

答えて

3

のget your link
からクラスpublic class UtcTimestampType extends TimestampTypeとします。このコード

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

使用して注釈

使用

または

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

* .hbm.xml

+1

私は、私が持っているすべての日付/タイムスタンプのプロパティに注釈をつけたくありません。私は休止状態で、常にデフォルトの型の代わりにUTCTimestampTypeを使用するようにします。 – samz

+0

不可能です。 UTCTimestampTypeはカスタムユーザータイプです。必要に応じて、Hibernateのライブラリを解凍してハックすることができます。 – Ilya

+0

この例では、Hibernate 3.6の例を見てください。記述子の例であり、型ではありません。それは、アプリケーションが起動すると、デフォルトのものの代わりにこのタイプを登録することができますが、それはどのように/どこに言わないのですか。それは基本的に私の質問です。 – samz

19

代替へカスタムタイプを休止実装することは、あなたのJDBC接続URLに次のJDBCのオプションを追加することです:

useTimezone=true 
serverTimezone=UTC 

これはUTCタイムゾーンにあなたのJDBC接続を強制し、JVMのタイムゾーンから変換を実行するためにMySQLをお願いします。最終的な効果は、DATETIME列はUTCとして永続化されるのに対し、JVM上にローカルタイムゾーンを維持できることです(ログメッセージの出力など)。例えば

<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> 
      ... 
+1

ありがとうございます。それは魅力のように働く。 :) –

関連する問題