我正在使用列类型为“TIMESTAMP WITH TIMEZONE”的 Oracle 11.2 数据库来存储时间相关信息。我无法更改它,因为它已被现有系统使用。
Java 应用程序使用 ojdbc7 (v12.1.0.2) + hibernate 作为 JPA 提供程序。
为了便于理解,我简化了以下示例!
有一个实体“Product”将“TIMESTAMP WITH TIMEZONE”列映射到 java.util.Calendar
@Entity
@Table(name = "PRODUCT")
public class Product {
@Id
@Column(name = "ID")
private String id;
@Column(name = "START_DATE", columnDefinition = "TIMESTAMP WITH TIME ZONE")
private Calendar startDate;
....
}
如果我通过 HQL 查询加载它,它工作正常。
1.问题
如果我使用原始 sql 查询:
SELECT * FROM PRODUCT where id='123456';
我得到以下异常:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -101
sql 查询要复杂得多,我这里只使用了一个非常简单的示例。所以我不能简单地将其转换为 HQL 查询。
2.问题
如果我坚持使用具有 AEDT 等时区的开始日期的新产品。例如
2014-01-01 12:00:00 AEDT
它被保存在数据库中
01-JAN-14 01.00.00.000000000 UTC
如果我从 Java 应用程序再次查询它,Calendar 对象的时间为 UTC,如上所示,而不是 AEDT 的时间。这不仅仅是一个显示问题。
从 AEDT 到 UTC 的转换是正确的,但问题是使用时区 AEDT 插入的信息丢失了。
有没有办法防止这种情况?为什么会发生这种情况?我今天搜索了很多,但找不到好的提示。