我正在编写一个使用 JPA 和 GlassFish 3.1.2.2 和 EclipseLink 2.3.2 的应用程序。我正在使用 Oracle DB 11g 并尝试使用 TIMESTAMPTZ 字段类型将日期和时间与时区一起存储。
通过我的设置,我可以将带有时区的日期和时间保存到数据库中。(更新-实际上在查看实际的 SQL 调用时,它只是传递日期和时间。Oracle 在保存到数据库时必须附加时区)。
但是,在检索数据时,我收到以下异常:
异常 [EclipseLink-3002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.ConversionException 异常描述:对象 [oracle.sql.TIMESTAMPTZ@12cbe3f],属于 [class oracle. sql.TIMESTAMPTZ],来自映射 [org.eclipse.persistence.mappings.DirectToFieldMapping[startDateTime-->APPT_EVENT.START_DATE_TIME]] 与描述符 [RelationalDescriptor(com.ntst.caremanager.server.entities.ApptEvent -> [DatabaseTable(APPT_EVENT )])],无法转换为 [class java.util.Date]。
有没有人遇到过这种情况?这就是我的实体类中的“startDateTime”字段的设置方式:
@Column(name = "START_DATE_TIME")
@Temporal(TemporalType.TIMESTAMP)
private Date startDateTime;
START_DATE_TIME 在 DB 中使用以下 DDL 定义:
"START_DATE_TIME" TIMESTAMP (6) WITH TIME ZONE
我在这里的 eclipselink wiki 上读到EclipseLink 本身就支持 oracle 的 TIMESTAMPTZ,无需任何转换。我还尝试在我的实体类中使用“日历”类型而不是“日期”时间。
更新:也试过这个
@Convert("timestamptz")
@TypeConverter(name="timestamptz", dataType=TIMESTAMPTZ.class)
@Column(name = "START_DATE_TIME")
@Temporal(TemporalType.TIMESTAMP)
private Date startDateTime;
还是没有运气。奇怪的是,添加转换器后,持久化到数据库不再起作用。尝试保存值时出现此错误。
异常 [EclipseLink-3002] (Eclipse Persistence Services - 2.3.3.v20120629-r11760):org.eclipse.persistence.exceptions.ConversionException 异常描述:对象 [12/4/12 7:00 AM],类 [class java.util.Date],来自映射 [org.eclipse.persistence.mappings.DirectToFieldMapping[startDateTime-->APPT_EVENT.START_DATE_TIME]] 与描述符 [RelationalDescriptor(com.ntst.caremanager.server.entities.ApptEvent --> [DatabaseTable (APPT_EVENT)])],无法转换为 [class oracle.sql.TIMESTAMPTZ]。
尝试检索值时仍然出现相同的错误。我还尝试将 Glassfish 更新到 EclipseLink 2.3.3 并得到了同样的错误。
这是我的持久性文件:
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="CM-warPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>CMDEV</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
<property name="eclipselink.target-server" value="SunAS9"/>
</properties>
有没有人见过这个问题,或者看到我可能犯的任何错误?
谢谢!