Я обновляю 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)]
Итак, почему бы не изменить тип данных на сервере sql на smallint? Или я что-то упускаю?
Это случай различий в схеме базы данных и определениях ваших сущностей. -- Он действительно хочет, чтобы вы выровняли их оба: либо уменьшите длину NUMBER(x, 0)
в Oracle, либо оставьте ее как NUMBER(10, 0)
, но вместо этого измените тип столбца на другой, кроме SMALLINT
в SQLServer. Изменение содержимого аннотации объекта здесь не поможет.
Определения сущностей работали как часы в спящем режиме 6.1.x. И я бы хотел избежать изменений схемы, слишком большого количества развертываний - обе схемы для oracle и для sqlserver были созданы некоторыми предыдущими версиями спящего режима, поэтому я надеялся, что поведение обработки EnumJavaType
можно каким-то образом «отменить».
Да, откатитесь обратно на 6.1.
@siggemannen молодец :D
Решение состоит в том, чтобы аннотировать это следующим образом:
@JdbcType(IntegerJdbcType.class)
@Enumerated(EnumType.ORDINAL)
@JdbcType
заставит SqlTypes.SMALLINT
, как это было ранее реализовано непосредственно в EnumJavaType
.
Может быть, это поможет? mssqltips.com/sqlservertip/2944/… прокрутите вниз до раздела «Сводка».