org.eclipse.persistence.exceptions.ConversionException При использовании JPA для преобразования Oracle TIMESTAMPTZ в java.util.Date

#java #oracle #jpa #eclipselink

#java #Oracle #jpa #eclipselink

Вопрос:

Я использую Eclipselink 2.7.6, Oracle 12c, Payara 5, и я получаю исключение преобразования при выполнении запроса.

Определение сущности является:

     @Column(name = "RUN_START_TIME")
    @Temporal(TemporalType.TIMESTAMP)
    private Date runStartTime;
    @Column(name = "RUN_STOP_TIME")
    @Temporal(TemporalType.TIMESTAMP)
    private Date runStopTime;
  

The persistence.xml файл имеет следующие свойства:

 <properties>
      <property name="eclipselink.logging.level" value="FINE"/>
      <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.Oracle12Platform"/>
      <property name="eclipselink.target-server" value="Glassfish"/>
    </properties>
  

И я добавил следующую зависимость в свой POM.xml:

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

У кого-нибудь есть какие-либо предложения о том, что я мог делать неправильно? Я видел пару других потоков по этому поводу, но у большинства нет решений / ответов, а другие, похоже, предполагают, что того, что я определил, должно быть достаточно. У меня есть такая же кодовая база, работающая и с MS SQL.

Обновление: Я попытался выполнить ряд действий, основанных на комментариях, включая использование различных типов форматов даты / временных меток, последним из которых был java.time.Смещение даты и времени. Я получаю тот же вывод об ошибке:

 Exception [EclipseLink-3002] (Eclipse Persistence Services - 2.7.6.payara-p1): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [oracle.sql.TIMESTAMPTZ@38b7d502], of class [class oracle.sql.TIMESTAMPTZ], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[runStartTime-->ASR_RUN.RUN_START_TIME]] with descriptor [RelationalDescriptor(....ASRRun --> [DatabaseTable(ASR_RUN)])], could not be converted to [class java.time.OffsetDateTime].
    at org.eclipse.persistence.exceptions.ConversionException.couldNotBeConverted(ConversionException.java:81)
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToOffsetDateTime(ConversionManager.java:930)
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObject(ConversionManager.java:123)
    at org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform.convertObject(DatasourcePlatform.java:226)
    at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.getObjectValue(AbstractDirectMapping.java:611)
    at org.eclipse.persistence.queries.ReportQueryResult.processItemFromMapping(ReportQueryResult.java:186)
  

Поскольку сообщение всегда одно и то же, меняется только имя класса, я все еще думаю, что у меня что-то настроено неправильно. Я обязательно использовал следующее в своем POM-файле, чтобы убедиться, что я использую последние форматы даты:

         <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.oracle</artifactId>
            <version>2.7.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
        <!--dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>12.2.0.1</version>
        </dependency-->
        <!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8dms -->
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8dms</artifactId>
            <version>19.6.0.0</version>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.7.6</version>
        </dependency>
  

Я пробовал различные версии драйверов jdbc, как вы можете видеть из прокомментированной версии.

Я все еще не уверен, что могло быть неправильно настроено.

Комментарии:

1. Не используйте старые Date , скорее используйте новые классы java.time

2. Нет, это не сработало: тип [class java.sql.Time] для атрибута [runEventTime] в классе объектов [class com.crawford.proarchiver.papswebservice.entity . ASRRunEvent] недопустимый тип для временного отображения. Атрибут должен быть определен как java.util. Дата или java.util. Календарь.

3. Я не говорю о java.sql.Time, я говорю о java.time . И здесь вы получите подробную информацию о том, как использовать.

4. Хорошо, попробовал это и получил это: Исключение [EclipseLink-3002] (службы сохранения Eclipse — 2.7.6.payara-p1): org.eclipse.persistence.exceptions. Описание исключения ConversionException: Объект [oracle.sql.TIMESTAMPTZ@3a24e26f], класса [class oracle.sql.TIMESTAMPTZ], из сопоставления [org.eclipse.persistence.mappings. Сопоставление DirectToFieldMapping[runStartTime—>ASR_RUN.RUN_START_TIME]] с дескриптором [RelationalDescriptor(…. Не удалось преобразовать ASRRun —> [DatabaseTable(ASR_RUN)])] в [класс java.time. LocalDateTime]. Спасибо за предложения! Продолжайте их вводить.

5. Существует также тип java.sql.Timestamp . ИМХО, даже Java8 не доработал свой API. Это довольно сложная тема, и вам следует ознакомиться с некоторой теорией об этом, прежде чем пытаться. Также обратите внимание, что временная метка типа данных Oracle С ЧАСОВЫМ поясом имеет несколько недостатков в производительности.