2008-09-17 34 views
2

將JPA實體與Oracle 10g結合使用時遇到以下非常煩人的行爲。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具有主鍵編號列「ID」和時間戳列「activationDate」。

讓我們假設我創建了這個類的一個實例,其激活日期爲「15. Sep 2008 00:00 AM」。我的本地時區是GMT + 02:00的CEST。當我堅持這個對象並使用sqlplus從表T_ORDER中選擇數據時,我發現表中實際存儲了「2008年9月22日22:00」,這是正確的,因爲oracle db時區是GMT。

但現在煩人的部分。當我將這個實體讀回到我的JAVA程序中時,我發現Oracle時區被忽略,我得到了「2008年9月22日22:00 CEST」,這是明顯錯誤的。

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

有沒有解決方案呢?我想最簡單的解決方案是將oracle dbs時區設置爲GMT + 02,但不幸的是我不能這樣做,因爲還有其他應用程序使用相同的服務器。

我們用下面的技術

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

回答

2

出於這個確切原因,您不應該使用日曆來訪問數據庫中的日期。在時間

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

java.util.Date點了一下,無論任何時區:應使用java.util.Date作爲如此。日曆可用於格式化特定時區或區域設置的日期。

0

我已經有我的JPA和時間戳問題的份額。我一直在閱讀中oracle forums並請檢查以下內容:

  • 在數據庫中的字段應該是TIMESTAMP_TZ並不僅僅是TIMESTAMP
  • 嘗試添加註釋@Temporal(值= TemporalType.TIMESTAMP)
  • 如果您確實不需要時區,請輸入日期或時間戳字段。
+0

謝謝你的回答。 我偶然發現了上面提到的同一個oracle論壇線程。不幸的是,所有給出的解決方案都與EclipseLink相關,我真的不想切換到新的持久性API實現。 – huo73 2008-09-17 12:43:59

相關問題