2011-01-01 12 views
12
<property name="hibernate.hbm2ddl.auto">update</property> 

mogę tworzyć moje schematu bazy danych, automatycznie dodać właściwości, ograniczenia, kluczowe etc ... ale co zaktualizować schematu bazy danych? Jeśli usunę część właściwości z moich obiektów, hibernacja go nie usunie, lub jeśli zmienię pewne ograniczenie, hibernacja nie dotknie już utworzonego ograniczenia ...Aktualizacja schematu bazy danych z hibernacji

Jest więc sposób na zaktualizowanie hibernacji schemat bazy danych?

Dzięki.

Odpowiedz

6

Stworzyliśmy własne narzędzie, które tworzy niezbędne krople kolumn i tabel bazy danych oraz dodaje te krople do wygenerowanego SQL dla aktualizacji baz danych. Ale musieliśmy dodać kilka dodatków do generowania SchemaUpdate, aby działało:

  • Musieliśmy dodać kontrole właściwości nie-null. Obejmuje to wydawanie instrukcji UPDATE na danych, aby wyeliminować wartości null, jeśli to możliwe, prowadząc do następnego punktu wartości domyślnych.
  • Musieliśmy dodać kontrole dla domyślnych wartości kolumn. Wartości domyślne są wnioskowane przez zerowanie kolumny i jej typ danych. Prymitywy są zawsze inicjowane do zera lub false, not-null enum do swojej pierwszej wartości wyliczeniowej, ale dla innych obiektów skrypt musi zostać zmodyfikowany ręcznie.
  • Dodaliśmy także obsługę zmiany rozmiaru kolumn varchar, ponieważ były przypadki, w których różniła się długość kolumny bazy danych i @Column(length).

Ale żeby to wszystko połączyć, kompletne narzędzie nie może zostać utworzone w ten sposób, ponieważ co, jeśli kolumna zostanie zmieniona w kodzie? Co się stanie, jeśli typ zmieni się w sposób nieautomatycznie wymienialny (bool na datę?). Jeśli nie masz dostępu do historii refaktoryzacji, nie zawsze możesz propagować zmiany.

3

Nie, nie ma. hbm2ddl nie jest przeznaczony do pełnego zarządzania twoimi migracjami schematu. Najlepiej, jeśli użyjesz go tylko do zmian dodatków do schematu i edycji ręcznej (wygenerowanych skryptów) do czegokolwiek innego.

1

Hibernate zapewnia klasę o nazwie SchemaUpdate który jest w stanie zsynchronizować zestaw odwzorowań stan hibernacji ze schematu bazy

Old post, ale niech społeczność wiem, czy to jest dobre :)

5

Obecnie stosujemy liquibase do przeprowadzaj automatyczne zmiany w bazie danych w sposób agnostyczny w bazie danych. Może być możliwe wyodrębnienie poleceń płynnych bezpośrednio ze swoich adnotacji dotyczących hibernacji, ale nie sądzę, aby takie narzędzie istniało, więc prawdopodobnie będziesz musiał to zrobić samodzielnie.

+0

Co masz na myśli mówiąc, że monopol jest agnostykiem baz danych? Próbowałem uruchomić zestaw zmian typu liquibase wygenerowany na jednym RDBMS na innym RDBMS (tj. Programie bazy danych) i nie działał. – Fletch

+2

Fletch - Używam go od lat i jest agnostyczny, ale jeśli utkniesz swój kod na konkretnej db, to nie będzie. Spróbuj użyć węzłów XML, takich jak ... wtedy to się przetłumaczy. – csharp4me

2

niektórych projektów, które mogłyby być przydatne do zarządzania zmiany schematu:

  • mybatis (1049 pytania oznaczone na SOW)
  • Liquibase (663 pytania oznaczone na SOW)
  • Flyway (400 pytania oznaczone na SOW)

Innym zasobem, który może okazać się przydatny, jest feature comparison na stronie internetowej Flyway (The są to inne powiązane projekty wymienione tam).