EclipseLink和Oracle DB的TimeZone错误

Wan*_* Li 5 jpa eclipselink oracle11g jpa-2.0

我正在编写使用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.class]的对象[oracle.sql.TIMESTAMPTZ@12cbe3f]。 sql.TIMESTAMPTZ],从映射[org.eclipse.persistence.mappings.DirectToFieldMapping [startDateTime-> APPT_EVENT.START_DATE_TIME]]与描述符[RelationalDescriptor(com.ntst.caremanager.server.entities.ApptEvent-> [ )])],无法转换为[class java.util.Date]。

有人遇到过吗?这是我的实体类中的“ startDateTime”字段的设置方式:

@Column(name = "START_DATE_TIME")
@Temporal(TemporalType.TIMESTAMP)
private Date startDateTime;
Run Code Online (Sandbox Code Playgroud)

在数据库中使用以下DDL定义了START_DATE_TIME:

"START_DATE_TIME" TIMESTAMP (6) WITH TIME ZONE
Run Code Online (Sandbox Code Playgroud)

我已阅读上的EclipseLink维基这里说的EclipseLink本身支持Oracle的TIMESTAMPTZ没有任何必要的转换。我还尝试在实体类中使用“日历”类型而不是“日期”时间。

更新:也尝试过

@Convert("timestamptz")
@TypeConverter(name="timestamptz", dataType=TIMESTAMPTZ.class)
@Column(name = "START_DATE_TIME")
@Temporal(TemporalType.TIMESTAMP)
private Date startDateTime;
Run Code Online (Sandbox Code Playgroud)

仍然没有运气。奇怪的是,添加了转换器后,持久化到数据库将不再起作用。尝试保存值时出现此错误。

异常[EclipseLink-3002](Eclipse Persistence Services-2.3.3.v20120629-r11760):org.eclipse.persistence.exceptions.ConversionException异常描述:类[class]的对象[12/4/12 7:00 AM] java.util.Date],从带有描述符[RelationalDescriptor(com.ntst.caremanager.server.entities.ApptEvent-> [DatabaseTableTable] (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>
Run Code Online (Sandbox Code Playgroud)

有人以前见过此问题,还是见过我可能犯的任何错误?

谢谢!

Wan*_* Li 1

我能弄清楚这一点,其实是我的疏忽造成的。我需要将 ojdbc6.jar 文件添加到 glassfish 的domains\domain1\lib\ext\ 目录中,以便 EclipseLink 可以找到 oracle.sql.timestamptz 类型。

就是这样。完成此操作后,我可以使用以下命令检索时区数据并将其存储到 Oracle 数据库:

@Column(name = "START_DATE_TIME")
@Temporal(TemporalType.TIMESTAMP)
private Calendar startDateTime;
Run Code Online (Sandbox Code Playgroud)

无需使用@TypeConverter或@Converter,因为EclipseLink会自动在此版本中对其进行转换。您还需要使用日历,而不是日期,以便可以检索时区信息。

我把这个留给其他可能遇到这个问题的人。