JPA エンティティを Oracle 10g と組み合わせて使用すると、次のような非常に厄介な動作が発生します。
次のエンティティがあるとします。
@Entity
@Table(name = "T_Order")
public class TOrder implements Serializable {
private static final long serialVersionUID = 2235742302377173533L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "activationDate")
private Calendar activationDate;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Calendar getActivationDate() {
return activationDate;
}
public void setActivationDate(Calendar activationDate) {
this.activationDate = activationDate;
}
}
このエンティティは Oracle 10g にマップされるため、DB にはT_ORDER
主キーNUMBER
列ID
とTIMESTAMP
列を持つテーブルが存在しますactivationDate
。
このクラスのインスタンスを有効化日で作成するとします15. Sep 2008 00:00AM
。私のローカル タイムゾーンは CEST ですGMT+02:00
。このオブジェクトを永続化し、T_ORDER
sqlplus を使用してテーブルからデータを選択すると、テーブルに実際に格納されていることがわかります。14. Sep 2008 22:00
これは、Oracle db のタイムゾーンが GMT であるため、これまでのところ問題ありません。
しかし、今は厄介な部分です。このエンティティを Java プログラムに読み戻すと、オラクルのタイム ゾーンが無視されていることがわかり14. Sep 2008 22:00 CEST
、これは明らかに間違っています。
したがって、基本的に、DB に書き込むときはタイムゾーン情報が使用され、読み取るときは無視されます。
これに対する解決策はありますか?私が推測する最も簡単な解決策は、Oracle dbs のタイムゾーンを に設定することですがGMT+02
、残念ながら、同じサーバーを使用している他のアプリケーションがあるため、これを行うことはできません。
以下の技術を使用しています
MyEclipse 6.5 JPA と Hibernate 3.2 Oracle 10g シン JDBC ドライバー