Рекомендации по генерации схемы спящего режима /JPA DB
Я просто хотел услышать мнение экспертов Hibernate о лучших методах генерации схемы DB для проектов на базе Hibernate/JPA. Особенно:
-
Какую стратегию использовать, когда проект только что начался? Рекомендуется ли Hibernate автоматически генерировать схему на этом этапе или лучше создавать таблицы базы данных вручную с самых ранних этапов проекта?
-
Притворившись, что на протяжении всего проекта была сгенерирована схема с использованием Hibernate, лучше ли отключать автоматическое создание схемы и вручную создавать схему базы данных непосредственно перед выпуском системы в производство?
-
И после того, как система была выпущена в производство, что лучше всего подходит для поддержки классов сущностей и схемы БД (например, добавление/переименование/обновление столбцов, переименование таблиц и т.д.)?
Ответы
Ответ 1
-
Всегда рекомендуется создавать схему вручную, предпочтительно с помощью инструмента, поддерживающего изменения схемы базы данных, например, большой Liquibase, Генерация схемы от сущностей велик в теории, но на практике она хрупка и вызывает много проблем в долгосрочной перспективе (поверьте мне об этом).
-
В продуктах всегда лучше всего вручную создавать и просматривать схему.
-
Вы делаете обновление для сущности и создаете соответствующее обновление script (ревизия), чтобы обновить схему базы данных, чтобы отразить изменение сущности. Вы можете создать собственное решение (я написал несколько) или использовать что-то более популярное, например, Liquibase (оно даже поддерживает откаты изменений схемы). Если вы используете инструмент построения, такой как maven или ant, рекомендуется подключить утилиту db schema update в процессе сборки, чтобы свежие сборки оставались в синхронизации со схемой.
Ответ 2
Хотя спорно, я бы сказал, что ответ на все 3 вопросов:. Пусть спящий режим автоматически генерировать таблицы в схеме
У меня пока не было проблем с этим. Вам может потребоваться время от времени очищать какое-либо поле вручную, но это не является головной болью по сравнению с отдельно отслеживанием сценариев DDL, т.е. Управлением их ревизиями и их синхронизацией с изменениями сущностей (и наоборот)
Для развертывания на производстве - очевидный совет - сначала убедитесь, что все создано ОК в тестовой среде, а затем развернуто на производстве.
Ответ 3
Вручную, потому что:
- Такая же база данных может использоваться различными приложениями, и не все
они будут использовать спящий режим или даже java. Схема базы данных должна
не должен быть продиктован ORM, он должен быть разработан вокруг данных и
бизнес-требований.
- Типы данных, выбранные спящим режимом, могут быть не лучше всего подходят для приложения.
- Как упоминалось в предыдущем комментарии, изменения в объектах потребуют ручного вмешательства, если потеря данных неприемлема.
- Такие вещи, как дополнительные свойства (общий термин не java свойства) на таблицах соединений прекрасно работают в СУБД, но несколько сложный и неэффективный для использования в ОРМ. Выполнение такого отображение из ORM → RDBMS может создавать таблицы, которые не являются эффективный. Теоретически можно построить точное соединение таблицу с использованием спящего сгенерированного кода, но для этого потребуется особенно при записи объектов.
Я бы использовал автоматическую генерацию для автономных приложений или баз данных, к которым можно получить доступ через один и тот же уровень ORM, а также, если приложение нужно портировать в разные базы данных. Это позволило бы сэкономить много времени, не требуя, чтобы один записывал и поддерживал специфические DDL-скрипты поставщика DB.
Ответ 4
Как сказал Божидар, не позволяйте Hibernate создавать и обновлять схему базы данных.
Пусть ваше приложение создает и обновляет схему базы данных.
Для java лучшим инструментом для этого является Flyway. Вам необходимо создать один или несколько файлов SQL с операторами DDL, которые описывают вашу схему базы данных. Эти SQL файлы затем выполняются Flyway. Для получения дополнительной информации см. Сайт Flyway.
Ответ 5
Я считаю, что многое из того, что обсуждаются или обсуждаются здесь, также должно быть связано с тем, что вы более комфортно с использованием кода или первого подхода к базе данных.
Лично я больше намерен пойти на последнее, и, ссылаясь на принцип единой ответственности (SRP), я предпочитаю, чтобы специалист по БД обрабатывал БД и специалист приложения, обрабатывающий приложение, чем приложение, обрабатывающее БД. Кроме того, я придерживаюсь мнения, что слишком много ярлыков будут работать отлично в начале, но создадут неуправляемые проблемы по мере роста/развития вещей.