我遇到以下十分恼人的行为时使用访问用户对象上结合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.时间戳)
  • 如果你真的不需要的时区,放在一个日期或时间戳领域。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top