是有一个问题访问用户实体,Oracle10g和日历类型的属性?
题
我遇到以下十分恼人的行为时使用访问用户对象上结合Oracle10g。
假设有以下实体。
@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;
}
}
这个实体的映射到Oracle10g,因此在数据库将有一个表T_ORDER与的一个主要关键数列中的"ID"和一个时间戳列"activationDate".
让我们假设我创建一个此类的实例,与启用日期"15.Sep2008年00:00".我当地的时区是中欧夏令时其是GMT+02:00.当我坚持这个目的,选择的数据表T_ORDER使用sqlplus,我找到出,在该表的实际上是"14.Sep2008 22:00"存储,这是确定的,迄今为止,因为oracle数据库时区格林尼治标准时间。
但现在令人讨厌的部分。当我读到这个实体返回到我的JAVA程序,我找到了那个oracle的时区是忽视和我"14.Sep2008 22:00CEST",这是绝对错误的。
所以基本上,当书面数据库的时区的信息将用,阅读时,它将会被忽略。
是否有任何解决方案为这个出来吗?最简单的解决方案,我想将要设置的oracle dbs时区格林尼治标准时间+02,但不幸的是,我不能这样做,因为还有其他应用中使用同一服务器上。
我们使用下列技术
MyEclipse6.5 访问用户与休眠3.2 Oracle10g薄JDBC驱动程序
解决方案
你不应该使用日历,用于访问日期从数据库,这个确切原因。你应该使用 java.util.Date
作为这样:
@Temporal(TemporalType.TIMESTAMP)
@Column(name="activationDate")
public Date getActivationDate() {
return this.activationDate;
}
java.util.Date
指向一个时刻时,不论任何时区。日历可以使用的格式一日期对于一个特定的时区或区域。
其他提示
我已经有我的份额的问题访问用户和时间戳。我已经阅读的 oracle论坛 并请检查下列各项:
- 现场数据库中应TIMESTAMP_TZ而不仅仅是时间戳
- 尝试增加的注释@时间(value=TemporalType.时间戳)
- 如果你真的不需要的时区,放在一个日期或时间戳领域。
不隶属于 StackOverflow