簡體   English   中英

JPA 實體、Oracle 10g 和日歷類型屬性是否存在問題?

[英]Is there a Problem with JPA Entities, Oracle 10g and Calendar Type properties?

將 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 ,其主鍵為NUMBERID和一個TIMESTAMPactivationDate

假設我創建了一個此類的實例,激活日期為15. Sep 2008 00:00AM 我當地的時區是 CEST 是GMT+02:00 當我持久化這個對象並使用 sqlplus 從表T_ORDER選擇數據時,我發現表中實際上存儲了14. Sep 2008 22:00 ,到目前為止還可以,因為 oracle db 時區是 GMT。

但現在是煩人的部分。 當我將這個實體讀回我的 JAVA 程序時,我發現 oracle 時區被忽略,我得到14. Sep 2008 22:00 CEST ,這絕對是錯誤的。

所以基本上,當寫入數據庫時​​,將使用時區信息,讀取時將被忽略。

有什么解決辦法嗎? 我猜最簡單的解決方案是將 oracle dbs 時區設置為GMT+02 ,但不幸的是我不能這樣做,因為還有其他應用程序使用同一台服務器。

我們使用以下技術

MyEclipse 6.5 JPA 與 Hibernate 3.2 Oracle 10g 瘦 JDBC 驅動程序

出於這個確切原因,您不應該使用日歷來訪問數據庫中的日期。 你應該像這樣使用java.util.Date

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

java.util.Date指向某個時刻,與任何時區無關。 日歷可用於格式化特定時區或語言環境的日期。

我已經遇到了 JPA 和時間戳方面的問題。 我一直在oracle 論壇上閱讀,請檢查以下內容:

  • 數據庫中的字段應該是 TIMESTAMP_TZ 而不僅僅是 TIMESTAMP
  • 嘗試添加注釋 @Temporal(value = TemporalType.TIMESTAMP)
  • 如果您真的不需要時區,請輸入日期或時間戳字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM