无法使用 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;
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;