2016-06-24 43 views
14

Jestem na prawie gotowym etapie mojego rozwoju JEE. Z dużym zaleceniem, aby NIE używać Hibernate's hbm2ddl.auto w produkcji, postanowiłem go usunąć.Nie używając hibernate.hbm2ddl.auto, jak wyeksportować wszystkie początkowe schematy do Flywaya?

Teraz dowiedziałem się o Flyway, który wydaje się świetny dla przyszłych zmian i migracji db, ale utknąłem na pierwszym etapie: Mam wiele podmiotów, niektóre podmioty dziedziczą z jednostek bazowych. To sprawia, że ​​instrukcja CREATE jest bardzo złożona.

Jaka jest najlepsza praktyka tworzenia pierwszego pliku migracji?

Dzięki!

+0

Możesz również znaleźć Liquibase pomocne. Wspominam o tym, aby nie wysuwać argumentu Flywaya przeciwko Liquibase, ale dlatego, że Liquibase zajmuje się tym szczególnym przypadkiem użycia jako koncepcja pierwszej klasy. Zobacz w szczególności http://www.liquibase.org/documentation/generating_changelogs.html. –

Odpowiedz

7

Jeśli w trakcie opracowywania zastosowałeś podejście "istoty pierwsze", musisz wygenerować początkowy schemat w taki sam sposób dla pierwszego wdrożenia na żywo: stworzy to pierwszy skrypt kreacji używany przez Flyway, a także może musi być drugim skojarzonym skryptem do zapełniania danych referencyjnych.

W skrócie, przyczyny nie są w stanie używać hbm2ddl.auto po pierwszej misji jest to, że create zniszczy istniejące dane i update nie jest na tyle wiarygodne, aby objąć wszystkie rodzaje zmian schematu (jak to brzmi jak może już wiem od this SO question).

Flyway to bardzo przydatne narzędzie, ale wymaga pewnego poziomu dyscypliny, który mógł nie istnieć w trakcie rozwoju. Przy przejściu od pierwszego wydania należy przygotować skrypty aktualizacji bazy danych dla Flywaya, które są odpowiednikiem zmian wprowadzonych w jednostkach od ostatniej wersji. Istnieją narzędzia (np. Różne komercyjne produkty od Redgate), które mogą pomóc tutaj: Te próby "zmiany" dwóch schematów i generowania schematów i/lub skryptów aktualizacji danych dla uzyskania z bazy danych A do bazy danych B. Ale z mojego doświadczenia, żaden z nich są doskonałe i nie docierają do świętego Graala, umożliwiając całkowicie zautomatyzowane podejście.

Prawdopodobnie najlepszym sposobem jest ręczne podejście typu "jak to działa", aby zapewnić, że nieinwazyjne skrypty aktualizacji są zobowiązane do kontroli kodu źródłowego, gdy wprowadzana jest zmiana jednostki wpływająca na schemat lub dane referencyjne - ale jak już wspomniano, będzie to wymagało dyscypliny i/lub udokumentowanych procesów dla wszystkich członków zespołu.

+0

Dzięki za odpowiedź !! 1 pytanie: używam JPA 2.1 i postgresql, eksportowałem schemat przy użyciu PGAdmin i umieszczałem w src/main/resources/db/migration/V1__initial.sql. Następnie utworzyłem klasę przy użyciu "@Startup" i "@Singleton", aby zainicjować Flyway.migrate(); Migracja zawsze kończy się niepowodzeniem z komunikatem Limit czasu. Czemu? – VHanded

+0

Czy polecenie 'migrate' powiedzie się, gdy spróbujesz użyć wiersza poleceń? –

+1

Znalazłem powód.To z powodu problemu z kodowaniem. Plik .sql musi być w UTF8, aby silnik bazy danych mógł go przetworzyć. Inaczej po prostu utknie na tej linii. – VHanded

0

Nie jestem pewien co do Flywaya, ale istnieje alternatywny sposób, możesz użyć zadań ant dla hibernacji do wygenerowania lub zaktualizowania schematu.

Mam nadzieję, że to pomaga.

1

Do pierwszego pliku migracji wystarczy bieżący plik ddl bazy danych. Istnieje wiele narzędzi, które mogą Ci to zapewnić (np. Opcja "copy ddl" w narzędziu IntelliJ IDEA Database lub klient GUI od dostawcy bazy danych).