2

列タイプ「TIMESTAMP WITH TIMEZONE」のOracle 11.2データベースを使用して、時間関連の情報を保存しています。既存のシステムで使用されているため、変更できません。

Java アプリケーションは、ojdbc7 (v12.1.0.2) + hibernate を JPA プロバイダーとして使用します。

わかりやすくするために、次の例を単純化しました。

「TIMESTAMP WITH TIMEZONE」列を java.util.Calendar にマップするエンティティ「Product」があります。

@Entity
@Table(name = "PRODUCT")
public class Product {

@Id
@Column(name = "ID")
private String id;

@Column(name = "START_DATE", columnDefinition = "TIMESTAMP WITH TIME ZONE")
private Calendar startDate;

....
}

HQL クエリを介してロードすると、正常に動作します。

1.発行

生の SQL クエリを使用する場合:

SELECT * FROM PRODUCT where id='123456';

次の例外が発生します。

org.hibernate.MappingException: No Dialect mapping for JDBC type: -101

SQL クエリはもっと​​複雑です。ここでは非常に単純な例を使用しました。したがって、単純に HQL クエリに変換することはできません。

2.発行

開始日が AEDT のようなタイムゾーンを持つ新製品を永続化する場合。例えば

2014-01-01 12:00:00 AEDT

としてデータベースに保存されます

01-JAN-14 01.00.00.000000000 UTC

Java アプリケーションから再度クエリを実行すると、Calendar オブジェクトの時刻は上記のように UTC で表示され、AEDT で表示されません。表示だけの問題ではありません。

AEDT から UTC への変換は正しいのですが、タイムゾーン AEDT で挿入されたという情報が失われていることが問題です。

これを防ぐ方法はありますか?とにかくなぜこれが起こっているのですか?今日はいろいろ調べたのですが、いいヒントが見つかりませんでした。

4

1 に答える 1