当前位置: 首页 > 知识库问答 >
问题:

EclipseLink和Oracle DB的时区错误

鱼旺
2023-03-14

我正在编写一个应用程序,使用JPA和GlassFish 3.1.2.2和EclipseLink 2.3.2。我正在使用Oracle DB 11g,并尝试使用TIMESTAMPTZ字段类型存储带有时区的日期和时间。

通过我的设置,我可以将带有时区的日期和时间保存到数据库中。(更新-实际上,当查看实际的SQL调用时,它只传递日期和时间。Oracle在保存到DB时必须附加时区)。

但是,在检索回数据时,我遇到以下异常:

异常[EclipseLink-3002](Eclipse持久性服务-2.3.2.v2011125-r10461):org。日食坚持不懈例外情况。ConversionException异常描述:对象[oracle.sql。TIMESTAMPTZ@12cbe3f],属于类[oracle.sql.timestamtz],来自映射[org.eclipse.persistence.mappings.DirectToFieldMapping[startDateTime--

以前有人遇到过这种情况吗?以下是我的实体类中的“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上读到Eclipse Link原生支持oracle的TIMESTAMPTZ,无需任何转换。我还尝试在我的实体类中使用“日历”类型而不是“日期”时间。

更新:也尝试过这个

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

还是没有运气。奇怪的是,随着转换器的添加,持久化到数据库不再有效。我在尝试保存值时遇到此错误。

异常【EclipseLink-3002】(Eclipse持久性服务-2.3.3.v20120629-r11760):org。日食坚持不懈例外情况。ConversionException异常描述:来自映射[org.eclipse.persistence.mappings.DirectToFieldMapping[startDateTime]的类[java.util.Date]的对象[12/4/12 7:00 AM]--

当尝试检索值时,我仍然会得到相同的错误。我还尝试将Glassfish更新到Eclipse Link 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>

以前有没有人看到过这个问题,或者看到过我可能犯的任何错误?

非常感谢。

共有3个答案

祁增
2023-03-14

在尝试了这里提到的大多数解决方案后:

  1. 将ojdbc6.jar添加到类路径。
  2. 有和没有@TypeConverter和@Converter。
  3. 将实体属性从和更改为java.util.日期和java.util.日历。
  4. 将eclipselink.target服务器设置为weblogic。

。。。仍存在以下错误:

异常[EclipseLink-3002](Eclipse持久性服务-2.3.2.v2011125-r10461):org。日食坚持不懈例外情况。ConversionException异常描述:对象[oracle.sql。TIMESTAMPTZ@12cbe3f],属于[类oracle.sql.TIMESTAMPTZ],来自映射[org.eclipse.persistence.mappings.DirectToFieldMapping[…]]使用描述符[关系描述符(com.ntst.caremanager.server.entities.ApptEvent--

当我将eclipselink.target数据库从“Oracle”更改为“Oracle11”时,我终于让它工作了(在我的实体中没有@转换器和java.util.日历)。

姬雪松
2023-03-14

我能够解决这个问题,这实际上是由于我的遗漏。我需要将ojdbc6.jar文件添加到glassfish的domain\domain1\lib\ext\目录中,以便Eclipse Link可以找到oracle.sql.timestamptz类型。

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

@Column(name = "START_DATE_TIME")
@Temporal(TemporalType.TIMESTAMP)
private Calendar startDateTime;

无需使用@TypeConverter或@Converter as EclipseLink自动将其转换为此版本。您还需要使用日历,而不是日期,以便检索时区信息。

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

高恺
2023-03-14

您需要指定转换器

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

您还需要配置服务器平台,以便Eclipse Link可以获得JDBC连接以正确进行转换。这可以在persistence.xml

<property name="eclipselink.target-server" value="WebLogic"/>
 类似资料:
  • C:\Users\ramachandran.s oracledb@1.2.0安装C:\Users\ramachandran.s\node\u modules\oracledb node gyp rebuild C:\Users\ramachandran.s\node\u modules\oracledb 我错过了什么,请帮忙

  • node-oracledb 是甲骨文公司官方发布的 Oracle 的 Node.js 驱动。目前最新版本 0.2 还是个预览版本,开发团队还在不断完善,包括对 Windows 平台的支持、LOB 支持、批获取/大查询结果集的流处理以及 DRCP 支持等。 支持 Oracle 的基本和高级特性: SQL 和 PL/SQL 执行 使用 javascript 对象和数组进行绑定 查询结果返回到 Java

  • EclipseLink有可能和夸库斯一起使用吗?还是夸库斯太难与Hibernate耦合了? 我们正在选择我们的MP实现的过程中,我们希望尽可能接近参考信息 我在https://quarkus.io/guides/甚至这个论坛上都没有看到太多信息来表明eclipselink也可以与Quarkus一起使用。 任何关于夸库斯为什么与JPA的一个特定的impl(如果是的话)绑得如此紧密的指示也将是受欢迎的

  • 我正在尝试使用EclipseLink创建一个表。正在使用的java类是:- EL警告]:2017-04-07 14:04:53.768--ServerSession(1650327539)--异常[EclipseLink-4002](Eclipse持久性服务-2.6.3.v20160428-59C81C5):org.Eclipse.Persistence.exceptions.DatabaseEx

  • 我是JPA的新手。我正在使用maven、Eclipselink2.0和JPA2.0。我已经使用数据库连接创建了实体。这是我的persistence.xml 这是我在尝试运行应用程序时遇到的错误。 --编辑--这是我获取EntityManager的方式

  • 使用OracleDB时出错,错误为“找不到指定的过程”。节点安装OracleDB正常。为构建而执行的步骤如下 已安装Visual Studio 2017 Visual C 14.0 使用/app.js内容运行代码时出错 使用strongloop/loopback CLI时出现相同错误。任何指示都会有帮助