Pytanie Wsparcie dla JPA / Hibernate dla migracji?


Obecnie pracuję nad aplikacją komputerową używającą JPA / Hibernate do utrzymywania danych w bazie danych H2. Ciekawe jakie są moje opcje, jeśli z jakiegoś powodu muszę wprowadzić zmiany w schemacie bazy danych w przyszłości. Może będę musiał wprowadzić nowe byty, usunąć je lub po prostu zmienić typy właściwości w encji.

  • Czy jest w tym wsparcie dla JPA / Hibernate?
  • Czy muszę ręcznie zakodować rozwiązanie?

21
2017-10-13 12:26


pochodzenie




Odpowiedzi:


Zwykle pozwalam Hibernate generować DDL podczas programowania, a następnie utworzyć ręczny skrypt migracji SQL podczas wdrażania na serwerze testowym (który później używam również dla UAT i serwerów na żywo).

Generowanie DDL w Hibernate nie oferuje w ogóle wsparcia dla migracji danych, jeśli wystarczy tylko dodać niezerowe pole, generowanie DDL nie może ci pomóc.

Nie znalazłem jeszcze żadnej użytecznej abstrakcji migracji, aby pomóc w tym.

Istnieje wiele bibliotek (spójrz na to pytanie SO na przykład), ale gdy robisz coś takiego jak dzielenie istniejącej jednostki na hierarchię przy użyciu dziedziczenia połączonego, zawsze powracasz do zwykłego SQL.


20
2017-10-13 12:40



+1 za bycie bardzo pouczającym :) - willcodejavaforfood


Może będę musiał wprowadzić nowe byty, usunąć je lub po prostu zmienić typy właściwości w encji.

Nie mam z tym żadnego doświadczenia, ale Liquibase zapewnia niektóre Integracja hibernacji i może porównać twoje mapowania z bazą danych i wygenerować odpowiedni dziennik zmian:

Integracja LiquiBase-Hibernate zapisuje zmiany w bazie danych wymagane przez bieżące mapowanie Hibernate do pliku dziennika zmian które można następnie sprawdzić i zmodyfikować w razie potrzeby przed wykonaniem.

Wciąż szukam okazji, aby się z nią bawić i znaleźć odpowiedzi na moje oczekujące pytania:

  • działa podczas używania adnotacji?
  • czy wymaga hibernate.cfg.xml plik (choć nie byłoby to dużą przeszkodą)?

Aktualizacja: Ok, oba pytania są objęte przez Nathana Voxlanda ta odpowiedź a odpowiedzi są następujące:

  • tak działa przy użyciu adnotacji
  • tak wymaga hibernate.cfg.xml (na razie)

7
2017-10-13 15:46



Fajnie, nie mam pliku odwzorowania hibernacji, tylko plik persistence.xml - willcodejavaforfood
@Willcodejavaforfood Tak, to samo tutaj. Ale jak już pisałem, nie jestem pewien, czy radzi sobie z plikiem persistence.xml (myślałem o wygenerowaniu pliku hibernate.cfg.xml, jeśli jest to wymagane). Może otwórz kolejne pytanie i Nathan Voxland (twórca Liquibase) pojawi się :) - Pascal Thivent
Zgodnie z tym [pytaniem] (stackoverflow.com/questions/776787/... potrzebujesz) potrzebujesz pliku hibernate.cfg.xml, ale masz rację, że nie byłby to duży problem - willcodejavaforfood
@willcodejavaforfood Dzięki, idealne potwierdzenie! - Pascal Thivent


Dostępne są dwie opcje:

  • db-to-hibernate - mirror DB zmienia się w twoje jednostki ręcznie. Oznacza to, że twój DB jest "wiodący"
  • hibernate-to-db - albo użyj hibernate.hbm2ddl.auto=updatelub ręcznie zmień DB po zmianie jednostki - tutaj twój model obiektowy jest "wiodący"

1
2017-10-13 12:49



Jakie zmiany można zahartować w hibernate.hbm2ddl = automatycznie radzę sobie z nieskompilowaniem mojego DB? :) - willcodejavaforfood
prawie każdy. Z wyjątkiem kolumn upuszczania, jak sądzę, gdzie będziesz musiał je upuścić samodzielnie. - Bozho
Zrobić nie posługiwać się hbm2ddl=auto w środowisku produkcyjnym błagasz o kłopoty, jeśli to zrobisz. - matt b
@matt b - Chcesz opracować? :) - willcodejavaforfood
@OttoAllmendinger Naprawię nazwę nieruchomości. I wiem, że wiele osób mówi "nie używaj tego w produkcji", ale jeśli jesteś ostrożny i posiadasz środowisko przemieszczania, jest to lepsza opcja niż obsługa skryptów migracji. - Bozho