#java #sql-server #hibernate #persistence #hibernate-mapping
Вопрос:
Я переношу схему базы данных Oracle на SQL Server и не уверен в определении столбца Hibernate.
Для миграции мы использовали Microsoft SQL Server Migration Assistant для Oracle, который также основывался на сопоставлении типов данных https://docs.microsoft.com/en-us/sql/relational-databases/replication/non-sql/data-type-mapping-for-oracle-publishers?view=sql-server-ver15 похоже, проделал хорошую работу. Например NUMBER(8,0)
, был переведен на NUMERIC(8,0)
и DATE
на DATETIME
,
Поскольку мы используем последнюю версию SQL Server, я использую в своем постоянстве следующий диалект org.hibernate.dialect.SQLServer2012Dialect
Проблема теперь в том, что проверка схемы Hibernate включена Numeric
и Date
значения дают мне следующие ошибки:
- найдено [числовое (типы#ЧИСЛОВОЕ)], но ожидается [bigint (Типы#БОЛЬШОЕ значение)] для числовых столбцов, определенных в режиме гибернации, как долго
- и нашел [дата и время (типы#МЕТКА ВРЕМЕНИ)], но ожидал [дата (типы#ДАТА)] для столбцов ДАТЫ и времени, определенных в режиме гибернации как Дата
- Та же проблема относится и к логическим значениям, которые представлены на SQL Server как ЧИСЛОВЫЕ(1,0), и я также должен задать определение столбца для этих полей.
Как решения, которые я нашел:
- Изменение типа данных базы данных с
NUMERIC
наINT
илиBIGINT
в зависимости от случая. Однако это означает, что я буду использовать другой тип данных в базе данных по сравнению с тем, который уже предложен в документации Microsoft (приведенной выше). - Добавьте в мою сущность определение столбца =
NUMERIC(x1,x2)
. Это решение, оно действительно работает и должно быть применено к нескольким столбцам, мне оно кажется обходным путем. - Изменение типа данных в сущности hibernate. Этого я хочу избежать, так как это приведет к многочисленным изменениям в моем коде.
Существует ли какой-либо лучший или глобальный подход для этих случаев вместо того, чтобы переходить к каждой сущности hibernate и определять там столбец в аннотации @Column?
Комментарии:
1. Для ваших
DATE
полей Oracle, которые являются просто датой без времени, будет использоваться соответствующий тип MSSQLdate
. Для ваших полей, у которых также есть время, тип MSSQL будет либоdatetime2
илиdatetimeoffset
. Рекомендуется избегать использования старогоdatetime
типа в MSSQL. Я не думаю, что смогу помочь с остальным, так как мой опыт работы с обеими этими базами данных ограничен.