无法使用 EclipseLink 从 Oracle TIMESTAMPTZ 列获取日历对象

Can't get Calendar object from Oracle TIMESTAMPTZ column with EclipseLink

Java 7
Oracle XE (11.2)
Spring Boot 1.3.5
EclipseLink 2.6.3
ojdbc7

我们在 Oracle 中有一个 table,其中有一个 TIMESTAMP 列。我们需要记录时区,所以我们将其切换为 TIMESTAMPTZ (TIMESTAMP (6) WITH TIME ZONE)。我们还将模型属性从 java.util.Date 转换为 java.util.Calendar,并应用了 @Temporal(TemporalType.TIMESTAMP) 注释。

@Temporal(TemporalType.TIMESTAMP)
private Calendar timeArrival;

所有内容均来自底部的 EclipseLink 文档 here。看起来应该是相当无缝的。

进行这些更改后,我们无法访问 table(使用 JpaRepository.findAll() 方法进行测试)。我们得到这个异常:

Exception Description: The object [oracle.sql.TIMESTAMPTZ@6b2a085f], of class [class oracle.sql.TIMESTAMPTZ], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[timeArrival-->TRIP_LEG.TIME_ARRIVAL]] with descriptor [RelationalDescriptor(<my-package>.data.model.TripLeg --> [DatabaseTable(TRIP_LEG)])], could not be converted to [class java.util.Date].
    at org.eclipse.persistence.exceptions.ConversionException.couldNotBeConverted(ConversionException.java:75) ~[org.eclipse.persistence.core-2.5.0.jar:na]
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToUtilDate(ConversionManager.java:788) ~[org.eclipse.persistence.core-2.5.0.jar:na]
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToCalendar(ConversionManager.java:375) ~[org.eclipse.persistence.core-2.5.0.jar:na]
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObject(ConversionManager.java:112) ~[org.eclipse.persistence.core-2.5.0.jar:na]

无论我们做什么,该错误都会发生,尽管我们的代码中不再有 Date 对象。我们尝试过的东西(以各种组合)无济于事:

1) 放入 @Converter/@TypeConverter 注释以指定 object/db 列类型

2) 从 ojdbc7 切换到 ojdbc6

3) 切换到 EclipseLink 2.5.0 以防这是最近出现的问题

4) 在application.properties (Oracle11)

中指定eclipselink.target-database

5) 部署到 WebLogic 以使用 JNDI 数据源而不是直接 JDBC 连接

唉。我的问题是我有错误的依赖项。

我原来有:

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.jpa</artifactId>
    <version>2.6.4</version>
</dependency>

这几天正常使用时效果很好,直到我将 Oracle 的 TIMESTAMPTZ 引入我的系统。这意味着我需要 Eclipselink Oracle 扩展 jar:

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.oracle</artifactId>
    <version>2.6.4</version>
</dependency>

现在我已经添加了它,一切都在没有任何额外配置或注释的情况下再次运行。我的模型字段是:

private Calendar timeArrival;