В моем проекте используется 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 (), что мне нужно? Или, может быть, какой-нибудь кастинг?




Это класс dbUnit (возможно, запутанный фреймворком журналирования в «o.d.u.SQLHelper»), выдающий это предупреждающее сообщение. Это означает, что указанный тип данных не поддерживается dbUnit.
Создайте запрос на расширение для поддержки этого типа данных стандарта 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 не обнаруживает поддержки «метка времени с часовым поясом». Вот как мы узнаем, что он отсутствует.
Большое спасибо @Jeff за подробный ответ, в конце концов я понял это, я действительно был сбит с толку и искал решение для hsqldb, поэтому я также не смог найти часто задаваемые вопросы.
@kopelitsa Мне интересно, как вы исправили и / или что вам нужно исправить дальше?
Все верно. Стандартная поддержка JDBC для TIMESTAMP WITH TIME ZONE доступна в HSQLDB версии 2.4.0 и новее. Тип Java -
java.time.OffsetDateTime. Также поддерживаются некоторые другие классы пакетовjava.time. Поэтому DbUnit должен проверить версию HSQLDB.