Hibernate/PostgreSQL GenericJDBCException: не удалось выполнить оператор при сохранении объекта с полем Polygon в тестахJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Hibernate/PostgreSQL GenericJDBCException: не удалось выполнить оператор при сохранении объекта с полем Polygon в тестах

Сообщение Anonymous »

Я использую Quarkus и Hibernate для работы с PostgreSQL/PostGIS. У меня есть объект Geofence, содержащий поле Polygon. Проблема возникает при запуске тестов с помощью Cucumber.
Проблема:
При запуске тестов я получаю следующую ошибку во втором и последующих примерах тестовых сценариев:

Код: Выделить всё

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute statement ... Caused by: org.postgresql.util.PSQLException: ERROR: cache lookup failed for type 18049 
Ошибка возникает во время выполнения метода persistAndRefresh:

Код: Выделить всё

public void persistAndRefresh(@NonNull Entity object) {
persist(object);  // Error happens at this line on the second test run
entityManager.flush();
entityManager.refresh(object);
}
Важная информация:
Тесты. Для написания тестов я использую Cucumber. Каждый тест имеет несколько примеров (примеры).
Контейнеры тестов: мы разворачиваем один контейнер PostgreSQL/PostGIS для всех тестов, а для каждого теста создаем дамп и восстанавливаем базу данных с помощью контейнеров тестов. Контейнер использует образ PostGIS:

Код: Выделить всё

private static final DockerImageName POSTGIS_IMAGE = DockerImageName
.parse("postgis/postgis:16-3.4")
.asCompatibleSubstituteFor("postgres");
Поведение проблемы:
Первый пример сценария выполняется успешно.
Во втором примере того же теста возникает ошибка. при вызове persist(object) (в начале persistAndRefresh).
Обходное решение: если мы вызываем метод, который извлекает все записи из таблицы (например, getAll()) перед сохранением объект, ошибка не возникает. Вот пример того, как мы работаем над решением этой проблемы:

Код: Выделить всё

geofenceClient.getAll(token).as(List.class);  // No error if this is called before persisting
persist(object);  // The error disappears after calling getAll()
Поле «Многоугольник»: поле «Многоугольник» в объекте «Геозона» сопоставляется с типом геометрии (Polygon, 4326) в базе данных.
Очистка контекста после каждый тест: после каждого теста мы очищаем контекст теста и восстанавливаем дамп базы данных, используя следующий код:

Код: Выделить всё

@After
public void cleanUp() {
// Clear test contexts
testContexts.stream().forEach(testContexts::destroy);

// Restore the database from the dump
PostgresResource.restoreDump();

// Clear the time context
DateTimeProvider.clearContext();
Что может быть причиной сбоя поиска в кэше ошибки типа 18049 во втором примере теста и как это можно исправить? Почему вызов метода, который извлекает все записи из таблицы, предотвращает ошибку?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -when-pers
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»