#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 С ЧАСОВЫМ поясом имеет несколько недостатков в производительности.