2017-02-09 4 views
11

Фактически я работал над моим проектом приложения загрузки Spring, и я заметил, что иногда есть время на подключение к моей базе данных на другом сервере (SQL Server), особенно когда я пытаюсь выполнить некоторую миграцию скрипта с помощью FlyWay, но он работает после нескольких попыток. Я заметил, что я не указал в своих свойствах spring.jpa.hibernate.ddl-auto. Затем я провел некоторое исследование и обнаружил, что рекомендуется добавить spring.jpa.hibernate.ddl-auto= create-drop в разработку. И измените его на: spring.jpa.hibernate.ddl-auto= none на производстве. Но я на самом деле не понял, как это работает, и как спящий режим создает схему базы данных, создавая значение или не используя ни одного. Можете ли вы объяснить технически, как это работает, и какие рекомендации используют это свойство на сервере разработки и производства. Спасибокак именно spring.jpa.hibernate.ddl-auto свойство работает весной?

+0

FWIW JPA 2.1 имеет свойство _standard_ javax.persistence.schema-generation.database.action, поэтому на самом деле не вижу необходимости использовать специфические свойства поставщика JPA для генерации схемы. –

ответ

22

Для записи, spring.jpa.hibernate.ddl-auto свойства Spring Data JPA специфичны и их способ определить значение, которое в конечном итоге будет принято в спящем режим по собственности он знает, hibernate.hbm2ddl.auto.

Значение create, create-drop, validate и update в основном влияют как инструмент управление схемой будет управлять схемой базы данных при запуске.

Например, операция update будет запрашивать API-интерфейс JDBC для получения метаданных базы данных, а затем Hibernate сравнивает создаваемую им объектную модель на основе чтения ваших аннотированных классов или сопоставлений XML HBM и будет пытаться настроить схему на -fly.

Операция update, например, попытается добавить новые столбцы, ограничения и т. Д., Но никогда не удалит столбец или ограничение, которое могло существовать ранее, но больше не работает как часть объектной модели из предыдущего запуска.

Как правило, в сценариях тестирования вы, вероятно, используете create-drop, чтобы создать свою схему, ваш тестовый пример добавляет некоторые макеты данных, запускает ваши тесты, а затем во время очистки тестовых объектов объекты схемы удаляются, оставляя пустую базу данных.

В разработке часто бывает, что разработчики используют update для автоматического изменения схемы для добавления новых дополнений при перезапуске. Но снова поймите, это не удаляет столбец или ограничение, которое может существовать в предыдущих исполнениях, которые больше не нужны.

В производстве часто рекомендуется использовать none или просто не указывать эту собственность. Это связано с тем, что администраторы баз данных часто просматривают сценарии миграции для изменения базы данных, особенно если ваша база данных разделена между несколькими службами и приложениями.

+1

Да, никогда не используйте генерацию ddl в производстве. Мы генерируем исходные скрипты для структуры таблицы, используя ddl, и включаем администратор базы данных в процесс. Затем мы включаем сценарии db как часть блока развертывания и выполняем их с помощью Flyway при развертывании приложения. Когда нам нужно изменить базу данных, мы добавляем новые сценарии в следующую версию приложения и развертываем их в стадии постановки. Flyway автоматически обнаружит текущую версию и запустит сценарии, необходимые для приведения базы данных в новейшую версию. Если все будет работать, мы начнем производство. –

+0

Что делать, если мы не указали это свойство? например, у меня есть свой собственный ... update У меня было это, и по какой-то причине мои таблицы были всегда отброшены, пока я не добавил вышеупомянутое свойство ;; ps: извините за образец кода) –

+0

У меня был H2 и весенний ботинок решил, что он должен был использовать" create-drop ", и я предполагаю, что это переопределяет мое свойство, которое я установил https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html –

Смежные вопросы