Метка времени с часовым поясом в HSQLDB

В моем проекте используется postgres, а также есть несколько тестов памяти с hsqldb (2.4.1)

У объекта Client есть это поле:

@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(updatable = false)
private Date creationDate;

Где Date - это java.util.Date

Таблица создается с использованием «отметки времени с часовым поясом».

CREATE TABLE client (
  id bigint NOT NULL,
  creationdate timestamp with time zone,
  ...)

Когда я запускаю тесты, dbunit загружает файл с данными, и я получаю эту ошибку:

2018-08-21 09:39:03,194 [warn] o.d.u.SQLHelper - CLIENT.CREATIONDATE data type (2014, 'TIMESTAMP WITH TIME ZONE') not recognized and will be ignored. See FAQ for more information.

Поэтому я решил, что мне следует расширить HSQLDialect, чтобы иметь возможность его поддерживать. Однако я не могу понять, как это именно registerColumnType () или registerHibernateType (), что мне нужно? Или, может быть, какой-нибудь кастинг?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 052
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это класс dbUnit (возможно, запутанный фреймворком журналирования в «o.d.u.SQLHelper»), выдающий это предупреждающее сообщение. Это означает, что указанный тип данных не поддерживается dbUnit.

TL; DR

Создайте запрос на расширение для поддержки этого типа данных стандарта SQL: https://sourceforge.net/p/dbunit/feature-requests/

Если dbUnit поддерживает этот тип данных, это произойдет намного быстрее, если вы реализуете его с помощью тестов и создадите запрос на слияние или прикрепите патч.

Подробности

В сообщении говорится: «См. FAQ», а на странице часто задаваемых вопросов есть информация по проблеме: http://dbunit.sourceforge.net/faq.html#typenotrecognized

Щелкните ссылку «заменить фабрику типов данных по умолчанию» на этот раздел часто задаваемых вопросов: http://dbunit.sourceforge.net/faq.html#typefactory

Он показывает использование фабрики типов данных, специфичных для базы данных. Ваша база данных - это HSQLDB, поэтому, как она упоминает, найдите ее класс в подпакете org.dbunit.ext.hsqldb: http://dbunit.sourceforge.net/xref/org/dbunit/ext/hsqldb/HsqldbDataTypeFactory.html.

Настройте dbUnit для использования, следуя примеру. Или, в зависимости от вашей настройки (например, с помощью Spring? Какой TestCase?), Это полезный пример и другой подход (этот пример - моя типичная настройка): http://dbunit.sourceforge.net/testcases/PrepAndExpectedTestCase.html#Configuration_Example_Using_Spring

Однако просмотр источника HsqldbDataTypeFactory показывает, что тип данных в нем не поддерживается: http://dbunit.sourceforge.net/xref/org/dbunit/ext/hsqldb/HsqldbDataTypeFactory.html

или его родитель: http://dbunit.sourceforge.net/xref/org/dbunit/dataset/datatype/DefaultDataTypeFactory.html

Родитель, DefaultDataTypeFactory, в строке 71 делегирует DataType: http://dbunit.sourceforge.net/xref/org/dbunit/dataset/datatype/DataType.html

DataType определяет поддерживаемые типы данных с помощью класса Java API Types: https://docs.oracle.com/javase/8/docs/api/java/sql/Types.html

Поиск на странице типов по запросу "отметка времени с часовым поясом" обнаруживает: https://docs.oracle.com/javase/8/docs/api/java/sql/Types.html#TIMESTAMP_WITH_TIMEZONE

Мы видим, что он был добавлен в Java 8.

Поиск DataType для типов.TIMESTAMP_WITH_TIMEZONE не обнаруживает поддержки «метка времени с часовым поясом». Вот как мы узнаем, что он отсутствует.

Все верно. Стандартная поддержка JDBC для TIMESTAMP WITH TIME ZONE доступна в HSQLDB версии 2.4.0 и новее. Тип Java - java.time.OffsetDateTime. Также поддерживаются некоторые другие классы пакетов java.time. Поэтому DbUnit должен проверить версию HSQLDB.

fredt 22.08.2018 08:31

Большое спасибо @Jeff за подробный ответ, в конце концов я понял это, я действительно был сбит с толку и искал решение для hsqldb, поэтому я также не смог найти часто задаваемые вопросы.

kopelitsa 22.08.2018 14:22

@kopelitsa Мне интересно, как вы исправили и / или что вам нужно исправить дальше?

Jeff 22.08.2018 15:02

Другие вопросы по теме