JPA 实体、Oracle 10g 和日历类型属性是不是存在问题?

Posted

技术标签:

【中文标题】JPA 实体、Oracle 10g 和日历类型属性是不是存在问题?【英文标题】:Is there a Problem with JPA Entities, Oracle 10g and Calendar Type properties?JPA 实体、Oracle 10g 和日历类型属性是否存在问题? 【发布时间】:2010-09-10 01:56:46 【问题描述】:

在将 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,列IDTIMESTAMPactivationDate

假设我创建了一个激活日期为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 带有休眠 3.2 的 JPA Oracle 10g 瘦 JDBC 驱动程序

【问题讨论】:

【参考方案1】:

出于这个确切原因,您不应该使用日历来访问数据库中的日期。你应该这样使用java.util.Date

@Temporal(TemporalType.TIMESTAMP)
@Column(name="activationDate")
public Date getActivationDate() 
    return this.activationDate;

java.util.Date 指向某个时刻,与任何时区无关。日历可用于为特定时区或地区设置日期格式。

【讨论】:

【参考方案2】:

我已经遇到了 JPA 和时间戳方面的问题。我一直在阅读oracle forums,请检查以下内容:

数据库中的字段应该是 TIMESTAMP_TZ 而不仅仅是 TIMESTAMP 尝试添加注解@Temporal(value = TemporalType.TIMESTAMP) 如果您真的不需要时区,请输入日期或时间戳字段。

【讨论】:

感谢您的回答。我偶然发现了您上面提到的同一 Oracle 论坛主题。不幸的是,给出的所有解决方案都与称为 EclipseLink 的东西有关,我真的不想切换到新的持久性 API 实现。 注释是 JPA 注释,因此不特定于 eclipselink。我将它与休眠一起使用,它们工作正常。

以上是关于JPA 实体、Oracle 10g 和日历类型属性是不是存在问题?的主要内容,如果未能解决你的问题,请参考以下文章

在 JPA 中,我如何找到具有属性值的所有类型和具有属性值的 ManyTomany 相关实体?

oracle和mysql 用jpa注解都有哪些区别

spring jpa之实体属性类型转换器AttributeConverter,自定义Converter,通用Converter

EBJ 3 实体 bean、JBoss 和 Oracle DB 10g 配置异常

JPA,映射实体人,其中包含名称类型的类

如何使用 JPA 和 Hibernate 通过自定义对象实体属性进行查询