Отображение порядкового перечисления с помощью Hibernate 6.5

Я обновляю Hibernate с 6.1.7 до 6.5.2, в моих объектах много столбцов перечислений, отмеченных значком @Enumerated(EnumType.ORDINAL). Моя кодовая база должна работать как с Oracle, так и с SQL Server.

Проблема заключается в изменении в Hibernate отображения перечислений с SMALLINT на TINYINT (если перечисления имеют всего несколько значений). У меня уже есть фиксированная схема БД для Oracle как NUMBER(10, 0) и для SQL Server как INT для порядковых перечислений.

Кажется, я не могу найти решение для сопоставления перечислений с аннотациями, которые бы работали для обеих БД одновременно. В настоящее время это работает для Oracle, но проверка схемы для SQL Server выдает:

Проверка схемы: в столбце [XXXX] в таблице [XXX] обнаружен неверный тип столбца; найдено [int (Types#INTEGER)], но ожидается [smallint (Types#SMALLINT)]

Есть идеи, как это исправить?

Я попробовал добавить @JdbcTypeCode(Types.SMALLINT), те же ошибки. Также @Column(columnDefinition = "int"), который исправляет SQL Server, но Oracle начинает сбоить при проверке схемы:

Проверка схемы: обнаружен неправильный тип столбца в столбце [definitionRef_targetType] в таблице [m_acc_cert_campaign]; найдено [число (Types#NUMERIC)], но ожидается [int (Types#TINYINT)]

Может быть, это поможет? mssqltips.com/sqlservertip/2944/… прокрутите вниз до раздела «Сводка».

Jorge Campos 09.07.2024 17:19

Итак, почему бы не изменить тип данных на сервере sql на smallint? Или я что-то упускаю?

siggemannen 09.07.2024 17:27

Это случай различий в схеме базы данных и определениях ваших сущностей. -- Он действительно хочет, чтобы вы выровняли их оба: либо уменьшите длину NUMBER(x, 0) в Oracle, либо оставьте ее как NUMBER(10, 0), но вместо этого измените тип столбца на другой, кроме SMALLINT в SQLServer. Изменение содержимого аннотации объекта здесь не поможет.

M. Prokhorov 09.07.2024 18:59

Определения сущностей работали как часы в спящем режиме 6.1.x. И я бы хотел избежать изменений схемы, слишком большого количества развертываний - обе схемы для oracle и для sqlserver были созданы некоторыми предыдущими версиями спящего режима, поэтому я надеялся, что поведение обработки EnumJavaType можно каким-то образом «отменить».

viliam 09.07.2024 19:15

Да, откатитесь обратно на 6.1.

siggemannen 10.07.2024 15:47

@siggemannen молодец :D

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

Ответы 1

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

Решение состоит в том, чтобы аннотировать это следующим образом:

@JdbcType(IntegerJdbcType.class)
@Enumerated(EnumType.ORDINAL)

@JdbcType заставит SqlTypes.SMALLINT, как это было ранее реализовано непосредственно в EnumJavaType.

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