2

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主キーNUMBERIDTIMESTAMP列を持つテーブルが存在しますactivationDate

このクラスのインスタンスを有効化日で作成するとします15. Sep 2008 00:00AM。私のローカル タイムゾーンは CEST ですGMT+02:00。このオブジェクトを永続化し、T_ORDERsqlplus を使用してテーブルからデータを選択すると、テーブルに実際に格納されていることがわかります。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 ドライバー

4

2 に答える 2

2

この正確な理由から、データベースから日付にアクセスするために Calendar を使用しないでください。java.util.Date次のように使用する必要があります。

@Temporal(TemporalType.TIMESTAMP)
@Column(name="activationDate")
public Date getActivationDate() {
    return this.activationDate;
}

java.util.Dateタイムゾーンに関係なく、ある瞬間を指します。Calendar を使用して、特定のタイムゾーンまたはロケールの日付をフォーマットできます。

于 2008-09-17T16:57:32.093 に答える
0

私はすでに JPA とタイムスタンプに関するいくつかの問題を抱えていました。私はオラクルフォーラムを読んでおり、次のことを確認してください。

  • データベースのフィールドは、TIMESTAMP だけでなく TIMESTAMP_TZ である必要があります
  • 注釈 @Temporal(value = TemporalType.TIMESTAMP) を追加してみてください
  • タイムゾーンが本当に必要ない場合は、日付またはタイムスタンプ フィールドを入力します。
于 2008-09-17T12:11:55.837 に答える