W jaki sposób właściwość spring.jpa.hibernate.ddl-auto działa na wiosnę?


130

Pracowałem nad projektem aplikacji Spring Boot i zauważyłem, że czasami występuje błąd przekroczenia limitu czasu połączenia z moją bazą danych na innym serwerze (SQL Server). Dzieje się tak szczególnie, gdy próbuję wykonać migrację skryptu, FlyWayale działa po kilku próbach.

Potem zauważyłem, że nie wskazałem spring.jpa.hibernate.ddl-autow moim pliku właściwości. Zrobiłem kilka badań i stwierdziłem, że zaleca się dodanie spring.jpa.hibernate.ddl-auto= create-dropw rozwoju. I zmień to na: spring.jpa.hibernate.ddl-auto= nonew produkcji.

Ale tak naprawdę nie rozumiałem, jak to naprawdę działa i jak hibernacja generuje schemat bazy danych przy użyciu create-droplub nonewartości. Czy możesz wyjaśnić technicznie, jak to naprawdę działa i jakie są zalecenia dotyczące używania tej właściwości w programowaniu i na serwerze produkcyjnym. Dziękuję Ci


1
FWIW JPA 2.1 ma standardową właściwość javax.persistence.schema-generation.database.action, więc nie ma potrzeby używania właściwości WZP specyficznych dla dostawcy do generowania schematu.
Neil Stockton

@NeilStockton Jednym z pomysłów, który badamy w Hibernate 6, jest możliwość kontrolowania generowania schematów w różny sposób w oparciu o kategorie; np. twoje tabele orm mogą być, noneale możesz chcieć, aby tabele Hibernate Search i Envers były generowane przy użyciu, updateponieważ są wewnętrznie zarządzane przez te projekty i nie chcesz zarządzać nimi ręcznie. Obecnie kontrolujemy to globalnie dla wszystkich tabel, niezależnie od ich pochodzenia / źródła. To dalszy powód do korzystania z opcji specyficznych dla dostawcy, jeśli chcesz ich użyć.
Naros,

Odpowiedzi:


216

Dla przypomnienia, spring.jpa.hibernate.ddl-autonieruchomość jest wiosna danych JPA specyficzne i jest ich sposób określić wartość, która zostanie ostatecznie przekazany do Hibernate pod nieruchomości to wie hibernate.hbm2ddl.auto.

Wartości create, create-drop, validate, i updatezasadniczo wpływają na sposób zarządzania narzędziami schemat będzie manipulować schematu bazy danych przy starcie.

Na przykład updateoperacja wysyła zapytanie do interfejsu API sterownika JDBC w celu uzyskania metadanych bazy danych, a następnie Hibernate porównuje model obiektów, który tworzy na podstawie odczytu klas z adnotacjami lub mapowań XML HBM i podejmuje próbę dostosowania schematu w locie.

Na updateprzykład operacja spróbuje dodać nowe kolumny, ograniczenia itp., Ale nigdy nie usunie kolumny lub ograniczenia, które mogło istnieć wcześniej, ale nie jest już częścią modelu obiektowego z poprzedniego uruchomienia.

Zazwyczaj w scenariuszach przypadków testowych prawdopodobnie użyjesz create-drop, aby utworzyć schemat, Twój przypadek testowy doda pewne dane próbne, uruchomisz testy, a następnie podczas czyszczenia przypadku testowego obiekty schematu zostaną usunięte, pozostawiając pustą bazę danych.

W fazie rozwoju często zdarza się, że programiści używają updatedo automatycznego modyfikowania schematu w celu dodania nowych dodatków po ponownym uruchomieniu. Ale znowu zrozum, nie usuwa to kolumny ani ograniczenia, które mogą istnieć z poprzednich wykonań, które nie są już potrzebne.

W środowisku produkcyjnym często zaleca się użycie nonetej właściwości lub po prostu jej nieokreślanie. Dzieje się tak, ponieważ administratorzy baz danych często przeglądają skrypty migracji pod kątem zmian w bazie danych, zwłaszcza jeśli baza danych jest współużytkowana przez wiele usług i aplikacji.


11
Tak, nigdy nie używaj generacji ddl w produkcji. Generujemy początkowe skrypty dla struktury tabeli przy użyciu ddl i angażujemy w ten proces DBA. Następnie dołączamy skrypty db jako część jednostki wdrożeniowej i wykonujemy je za pomocą Flyway podczas wdrażania aplikacji. Kiedy musimy zmodyfikować bazę danych, dodajemy nowe skrypty do kolejnej wersji aplikacji i wdrażamy do stagingu. Flyway automatycznie wykryje aktualną wersję i uruchomi skrypty potrzebne do przeniesienia bazy danych do najnowszej wersji. Jeśli wszystko działa, wdrażamy do produkcji.
Klaus Groenbaek,

1
co jeśli nie określimy tej właściwości? na przykład mam własną <bean id = "sessionFactory" class = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <prop key = "hibernate.hbm2ddl.auto"> aktualizację </prop> Miałem to iz jakiegoś powodu moje tabele były zawsze usuwane, dopóki nie dodałem wyżej wymienionej właściwości ;; ps: przepraszam za przykład kodu)
Ţîgan Ion

11
Dlaczego nie validatew kopercie produkcyjnej?
Shamal Karunarathne

20
@ShamalKarunarathne Aplikacje mogą być używane validatew środowisku produkcyjnym, ale zazwyczaj powinno to być ustawienie używane w środowisku testowym / jakościowym w celu sprawdzenia, czy skrypty bazy danych, które napisałeś lub zastosowałeś do narzędzia migracji bazy danych, są dokładne. Innym powodem, dla którego nie należy używać go validatew produkcji, jest to, że może to stanowić wąskie gardło podczas procesu uruchamiania aplikacji, szczególnie jeśli model obiektowy ma dość duży rozmiar lub jeśli w grę wchodzą inne czynniki związane z siecią.
Naros

1
Bez precyzyjnego śledzenia stosu trudno jest spekulować; jednak moim pierwszym przypuszczeniem byłoby to, że orderjest nieprawidłowo interpretowane przez parser SQL, ponieważ jest to słowo kluczowe, jeśli nie jest używane.
Naros,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.