当将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,因此在数据库中将有一个表T_ORDER
,该表具有主键NUMBER
列ID
和TIMESTAMP
列activationDate
。
假设我创建一个具有激活日期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带有Hibernate 3.2的JPAOracle 10g瘦JDBC驱动程序
出于这个确切原因,您不应使用日历来从数据库访问日期。您应该这样使用java.util.Date
:
@Temporal(TemporalType.TIMESTAMP)
@Column(name="activationDate")
public Date getActivationDate() {
return this.activationDate;
}
java.util.Date
指向时间点,与任何时区无关。日历可用于格式化特定时区或区域设置的日期。
我已经遇到了JPA和时间戳的问题。我正在阅读oracle forums,请检查以下内容: