Hibernate не меняет существующий столбец, это недостаток? - PullRequest
1 голос
/ 17 апреля 2019

У меня есть приложение весенней загрузки, которое подключается к базе данных PostgreSQL. Уровень DAO реализован с использованием Hibernate, JPA и auto-ddl, поэтому hibernate позаботится о создании таблицы

.

Вдруг сегодня мой друг попросил меня изменить один из типов столбца от BigInteger до String, тогда я сказал, что это невозможно, потому что этот столбец, уже заполненный данными и гибернацией, не позволит этому

Теперь он говорит, что это недостаток в спящем режиме, и у нас также были споры о том, могут ли компании изменять определение столбцов в зависимости от потребностей в производстве?

Вопрос

  1. Действительно ли это недостаток в спящем режиме?
  2. Часто ли ИТ-компании или организации изменяют определение столбцов в процессе производства?

Ответы [ 2 ]

6 голосов
/ 17 апреля 2019

Вы никогда не должны использовать auto-ddl в производстве .Он никогда не предназначался для использования в производстве, но для разработки.Причина, по которой вы не должны использовать его, заключается в том, что он может создать неоптимальный DDL или просто повредить ваши данные.

Предпочтительный подход к внесению изменений в БД - это создание папки, которая будет содержать все сценарии SQLкоторые изменяют структуру базы данных и сохраняют ее в системе контроля версий.Общее имя migrations.Затем вы можете вручную запустить эти сценарии в своей базе данных или использовать такой инструмент, как flyway (моя рекомендация) или liquibase .

Так как же вы можете использовать auto-ddl?Например, вы можете создать таблицу для вашей новой сущности, затем взять DDL, который использовался для ее создания, и после применения некоторых корректировок (при необходимости) сохранить ее в миграциях.Вы также можете использовать validate из hibernate.hbm2ddl.auto , чтобы проверить, совпадает ли ваша база данных с вашими сущностями.

И, наконец, ответить на ваши вопросы:

  1. Нет, это не недостаток hibernate, потому что auto-ddl никогда не предназначался для миграции баз данных.
  2. Компании никогда не меняют свои базы данных, используя такие утилиты, как auto-ddl.Кто-то (администратор базы данных или разработчик) готовит сценарий миграции, а затем он применяется вручную или с помощью инструмента миграции в выпуске.
2 голосов
/ 17 апреля 2019

Это не недостаток Hibernate, auto-ddl предназначен для создания схемы из модели, а не для ее обновления. Причина в том, что, как вы уже поняли, это редко бывает простым и может потребовать некоторого «массирования» данных.

Я бы не сказал, что это обычная практика - менять типы данных в производственных системах, но это, безусловно, верный сценарий, в котором можно оказаться. В мои годы мне приходилось делать это несколько раз, хотя обычно это что-то столь же тривиальным, как увеличение размера varchar или изменение с date на datetime. Переход с BigInteger на String кажется немного необычным, и я хотел бы спросить, как вы попали на эту позицию, это может указывать на проблему с дизайном.

В любом случае, решение состоит в том, чтобы изменить тип данных в базе данных, что не должно быть проблемой, а затем изменить отображение Hibernate, чтобы отразить это изменение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...