Naprawdę chcę wiedzieć więcej o aktualizacji, eksporcie i wartościach, które można podać. hibernate.hbm2ddl.auto
Muszę wiedzieć, kiedy korzystać z aktualizacji, a kiedy nie? A jaka jest alternatywa?
Oto zmiany, które mogą wystąpić w DB:
- nowe stoły
- nowe kolumny w starych tabelach
- kolumny usunięte
- zmieniono typ danych kolumny
- typ kolumny zmienił swoje atrybuty
- spadły stoły
- zmieniono wartości kolumny
W każdym przypadku jakie jest najlepsze rozwiązanie?
Istnieje również nieudokumentowana wartość „none”, która całkowicie ją wyłącza.
źródło
Wywoływana jest właściwość konfiguracji
hibernate.hbm2ddl.auto
W naszym środowisku programistycznym postanowiliśmy
hibernate.hbm2ddl.auto=create-drop
porzucić i utworzyć czystą bazę danych przy każdym wdrożeniu, aby nasza baza danych była w znanym stanie.Teoretycznie możesz ustawić
hibernate.hbm2ddl.auto=update
aktualizację bazy danych za pomocą zmian w modelu, ale nie ufałbym temu w produkcyjnej bazie danych. Wcześniejsza wersja dokumentacji mówiła, że przynajmniej eksperymentalna; Nie znam obecnego stanu.Dlatego w przypadku naszej produkcyjnej bazy danych nie należy ustawiać
hibernate.hbm2ddl.auto
- domyślnie nie wprowadza się żadnych zmian w bazie danych. Zamiast tego tworzymy ręcznie skrypt aktualizacji SQL DDL, który stosuje zmiany z jednej wersji do drugiej.źródło
Użyłbym liquibase za aktualizowanie db. Funkcja aktualizacji schematu hibernacji jest naprawdę odpowiednia tylko dla programistów, którzy opracowują nowe funkcje. W sytuacji produkcyjnej aktualizacja db musi być traktowana ostrożniej.
źródło
Chociaż jest to dość stary post, ale ponieważ przeprowadziłem kilka badań na ten temat, pomyślałem o udostępnieniu go.
hibernate.hbm2ddl.auto
Zgodnie z dokumentacją może mieć cztery prawidłowe wartości:
utwórz | aktualizacja | zatwierdzić | Utwórz-upuść
Poniżej wyjaśniono zachowanie pokazane przez te wartości:
Oto ważne punkty, na które warto zwrócić uwagę:
Table not found:<table name>
W przypadku, gdy dam dowolną wartość tej właściwości (powiedzmy abc, zamiast czterech wyżej omówionych wartości) lub pozostanie ona pusta. Pokazuje następujące zachowanie:
-Jeśli schemat nie występuje w bazie danych: - Tworzy schemat
-Jeśli schemat znajduje się w bazie danych: - zaktualizuj schemat.
źródło
Po pierwsze, możliwe wartości
hbm2ddl
właściwości konfiguracji są następujące:none
- Żadna akcja nie jest wykonywana. Schemat nie zostanie wygenerowany.create-only
- Zostanie wygenerowany schemat bazy danych.drop
- Schemat bazy danych zostanie usunięty i utworzony później.create
- Schemat bazy danych zostanie usunięty i utworzony później.create-drop
- Schemat bazy danych zostanie usunięty i utworzony później. Po zamknięciuSessionFactory
schemat bazy danych zostanie usunięty.validate
- Schemat bazy danych zostanie zweryfikowany przy użyciu odwzorowań encji.update
- Schemat bazy danych zostanie zaktualizowany poprzez porównanie istniejącego schematu bazy danych z odwzorowaniami encji.Poświęciłem wpis na blogu dotyczący najpopularniejszych strategii generowania Hibernacji DDL :
hibernate.hbm2ddl.auto="update"
to wygodne, ale mniej elastyczne, jeśli planujesz dodawać funkcje lub wykonywać niestandardowe skrypty.Jednak nawet jeśli korzystasz z Flyway, nadal możesz wygenerować skrypt początkowej migracji za pomocą hbm2ddl. W tym artykule pokazano, jak połączyć model jednostki JPA z modelem tabeli jOOQ.
źródło
hibernate.hbm2ddl.auto
automatycznie sprawdza poprawność i eksportuje DDL do schematu podczas tworzenia sessionFactory.Domyślnie nie wykonuje automatycznie tworzenia ani modyfikacji DB. Jeśli użytkownik ustawi jedną z poniższych wartości, automatycznie zmienia schemat DDL.
create - tworzenie tworzenia schematu
aktualizacja - aktualizacja istniejącego schematu
sprawdzanie poprawności - sprawdzanie poprawności istniejącego schematu
create-drop - twórz i upuszczaj schemat automatycznie po rozpoczęciu i zakończeniu sesji
źródło
Jeśli nie chcesz używać ciągów w swojej aplikacji i szukasz predefiniowanych stałych, spójrz na
org.hibernate.cfg.AvailableSettings
klasę zawartą w Hibernacyjnym pliku JAR, gdzie znajdziesz stałą dla wszystkich możliwych ustawień. W twoim przypadku na przykład:źródło
validate
: sprawdza poprawność schematu, baza danych nie zmienia się.update
: aktualizuje schemat przy użyciu bieżącego zapytania.create
: za każdym razem tworzy nowy schemat i niszczy poprzednie dane.create-drop
: upuszcza schemat po zatrzymaniu aplikacji lub jawnym zamknięciu SessionFactory.źródło
Myślę, że powinieneś się skoncentrować na
ta klasa sprawia, że Twoja konfiguracja jest dynamiczna, dzięki czemu możesz wybrać to, co najbardziej ci odpowiada ...
Zamówienie [SchemaExport]
źródło
validate
: Sprawdza poprawność schematu i nie wprowadza żadnych zmian w bazie danych.Załóżmy, że dodałeś nową kolumnę do pliku odwzorowania i wykonasz operację wstawiania, spowoduje to zgłoszenie wyjątku „brak kolumny XYZ”, ponieważ istniejący schemat jest inny niż obiekt, który zamierzasz wstawić. Jeśli zmienisz tabelę, dodając ręcznie tę nową kolumnę, a następnie wykonaj operację Wstaw, to z pewnością wstawi wszystkie kolumny wraz z nową kolumną do tabeli. Oznacza, że nie wprowadza żadnych zmian / zmienia istniejący schemat / tabelę.
update
: zmienia istniejącą tabelę w bazie danych podczas wykonywania operacji. Możesz dodawać lub usuwać kolumny za pomocą tej opcji hbm2ddl. Ale jeśli zamierzasz dodać nową kolumnę, która nie ma wartości „NULL”, to zignoruje dodanie tej konkretnej kolumny do bazy danych. Ponieważ tabela musi być pusta, jeśli chcesz dodać kolumnę „NOT NULL” do istniejącej tabeli.źródło
Od wersji 5.0 można teraz znaleźć te wartości w dedykowanym
Enum
:org.hibernate.boot.SchemaAutoTooling
(wzbogaconym o wartośćNONE
od 5.2).Lub nawet lepiej, ponieważ 5.1 , możesz również użyć tego, który łączy JPA 2 i „starsze” działania Hibernacji DDL.
org.hibernate.tool.schema.Action
Enum
Ale nie można jeszcze skonfigurować tego
DataSource
programowo. Byłoby lepiej użyć tego w połączeniu z,org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO
ale obecny kod oczekujeString
wartości (fragment zaczerpnięty zSessionFactoryBuilderImpl
):… Oraz wewnętrzne
enum
wartości obu tych elementóworg.hibernate.boot.SchemaAutoTooling
iorg.hibernate.tool.schema.Action
nie są ujawniane publicznie.Poniżej przykładowa
DataSource
konfiguracja programowa (używana w moich aplikacjach Spring Boot), która wykorzystuje gambit dzięki,.name().toLowerCase()
ale działa tylko z wartościami bez myślnika (niecreate-drop
na przykład):źródło
Do kogo szuka wartości domyślnej ...
Jest napisany w kodzie źródłowym w wersji 2.0.5 Spring-boot i 1.1.0 w JpaProperties:
źródło