Як власність spring.jpa.hibernate.ddl-auto точно працює у весні?


129

Я працював над проектом програми для завантаження програми Spring і зауважив, що іноді виникає помилка часу з’єднання з моєю базою даних на іншому сервері (SQL Server). Це трапляється спеціально, коли я намагаюся виконати деяку міграцію сценарію, FlyWayале це працює після декількох спроб.

Потім я помітив, що я не вказав spring.jpa.hibernate.ddl-autoу своєму файлі властивостей. Я провів кілька досліджень і виявив, що рекомендується додавати spring.jpa.hibernate.ddl-auto= create-dropв розробку. І змінити його на: spring.jpa.hibernate.ddl-auto= noneу виробництві.

Але я насправді не розумів, як це насправді працює і як сплячий режим генерує схему баз даних за допомогою create-dropабо noneзначенням. Чи можете ви поясніть, будь ласка, технічно, як це насправді працює, і які рекомендації щодо використання цієї властивості у розробці та на виробничому сервері. Дякую


1
FWIW JPA 2.1 має стандартну властивість javax.persistent.schema-generation.database.action, тому насправді не вбачається необхідність використання властивостей JPA для генерації схем.
Ніл Стоктон

@NeilStockton Однією з ідей, які ми вивчаємо в режимі Hibernate 6, є можливість мати змогу керувати генерацією схем по-різному на основі категорій; наприклад, ваші таблиці orm можуть бути, noneале ви можете хотіти, щоб ваші таблиці Hibernate Search і Envers були створені за допомогою, updateоскільки ними керують внутрішніми проектами, і ви не хочете керувати ними вручну. Зараз ми керуємо цим глобально для всіх таблиць незалежно від їх походження / джерела. Це також призведе до використання опцій, що стосуються постачальника, якщо ви хочете скористатися цим.
Нарос

Відповіді:


215

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

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

Наприклад, updateоперація запитає API драйвера JDBC, щоб отримати метадані бази даних, а потім Hibernate порівнює об'єктну модель, яку вона створює, базуючись на читанні ваших анотованих класів або відображення XM XML і спробує скорегувати схему на ходу.

Наприклад, updateоперація спробує додати нові стовпці, обмеження тощо, але ніколи не видалить стовпець або обмеження, які, можливо, існували раніше, але більше не є частиною об'єктної моделі з попереднього запуску.

Як правило, у сценаріях тестових випадків, ви, ймовірно, будете використовуватись create-dropдля створення схеми, ваш тестовий випадок додає деякі макетні дані, ви запускаєте тести, а потім під час очищення тестового випадку об’єкти схеми скидаються, залишаючи порожню базу даних.

У розробці часто буває звичайно бачити, як розробники використовують updateдля автоматичного зміни схеми для додавання нових доповнень після перезавантаження. Але знову ж зрозумійте, це не видаляє стовпчик або обмеження, які можуть існувати від попередніх страт, які більше не потрібні.

У виробництві часто рекомендується використовувати noneабо просто не вказувати цю властивість. Це пояснюється тим, що для DBA є звичайною практикою перегляду сценаріїв міграції на предмет змін у базі даних, особливо якщо ваша база даних поділяється між багатьма службами та програмами.


11
Так, ніколи не використовуйте покоління DDL у виробництві. Ми генеруємо початкові сценарії для структури таблиці за допомогою ddl та залучаємо DBA до цього процесу. Потім ми включаємо сценарії db як частину блоку розгортання та виконуємо їх за допомогою Flyway під час розгортання програми. Коли нам потрібно змінити базу даних, ми додаємо нові сценарії до наступної версії програми і розгортаємося для постановки. Flyway автоматично виявить поточну версію та запустить сценарії, необхідні для доведення бази даних до новітньої версії. Якщо все працює, ми розгортаємо до виробництва.
Klaus Groenbaek

1
що робити, якщо ми не вказамо цю властивість? наприклад, у мене є власний <bean id = "sessionFactory" class = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <prop key = "hibernate.hbm2ddl.auto"> update </prop> У мене це було і чомусь мої таблиці випадали завжди, поки я не додав вищезгадану властивість ;; ps: вибачте за зразок коду)
Ţîgan Ion

11
Чому б не validateу Production Env?
Шамаль Карунаратне

20
@ShamalKarunarathne Програми можуть використовуватись validateу виробництві, але зазвичай це має бути налаштування, яке ви використовуєте у вашому середовищі якості / тесту, щоб перевірити, чи сценарії бази даних, які ви написали або застосували до інструменту міграції ваших баз даних, є точними. Ще одна причина, яка не використовується validateу виробництві, полягає в тому, що це може бути вузьким місцем під час запуску вашої програми, особливо якщо ваша об'єктна модель має досить великі розміри або якщо інші фактори, пов’язані з мережею, приходять у дію.
Нарос

1
Без чіткого сліду стека важко міркувати; однак, моя перша здогадка - це те order, що інтерпретується SQL-аналізатором неправильно, оскільки це ключове слово, якщо його не уникнути.
Нарос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.