gpt4 book ai didi

java - JPA 实体、Oracle 10g 和日历类型属性有问题吗?

转载 作者:行者123 更新时间:2023-11-30 09:59:05 24 4
gpt4 key购买 nike

在将 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 具有主键 NUMBERIDTIMESTAMPactivationDate

假设我创建了一个激活日期为 15 的此类实例。 2008 年 9 月 00:00AM。我本地的时区是 CEST,即 GMT+02:00。当我持久化这个对象并使用 sqlplus 从表 T_ORDER 中选择数据时,我发现表中实际上是 14。 2008 年 9 月 22:00 已存储,到目前为止没问题,因为 oracle 数据库时区是 GMT。

但现在是烦人的部分。当我将这个实体读回我的 JAVA 程序时,我发现 oracle 时区被忽略了,我得到了 14。 2008 年 9 月 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 指向一个时刻,与任何时区无关。日历可用于为特定时区或语言环境设置日期格式。

关于java - JPA 实体、Oracle 10g 和日历类型属性有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/82235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com