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