hbm2ddl – przydatne narzędzie w NHibernate

Co to jest hbm2ddl?

hbm2ddl jest narzędziem wchodzącym w skład pakietu NHibernate . Służy ono do tworzenia, aktualizacji i sprawdzenia poprawności bazy danych na podstawie modelu. Niestety dokumentacja do niego jest dość uboga… Wspominałem o nim przy okazji wpisów na temat konfiguracji NHibernate i PostgreSQL i opisu Fluent NHibernate . W tym wpisie pokażę kilka przykładów jak można wykorzystać hbm2ddl.

Tworzymy model

Wykorzystamy model z wpisu o konfiguracji NHibernate i PostgreSQL, czyli:

Tworzymy aplikację konsolową i instalujemy pakiety Npgsql i NHibernate.

Tworzymy plik hibernate.cfg.xml, czyli konfigurację NHibernate:

Następnie tworzymy klasy Author i Book:

Tworzymy mapowanie czyli pliki Author.hbm.xml:

i Book.hbm.xml:

Jak korzystać z hbm2ddl

hbm2ddl dostarcza nam następujące klasy z których będziemy korzystać: SchemaExport, SchemaValidator i SchemaUpdate

Tworzymy schemat bazy danych

Aby stworzyć schemat bazy danych dodaj poniższy kod do funkcji Main:

 

Linie 1-2 tworzymy konfigurację na podstawie pliku hibernate.cfg.xml.

Linia 3 dodajemy mapowanie klasy Author.

Linia 4 tworzenie schematu na podstawie przygotowanej konfiguracji. Funkcja Create przyjmuje dwa parametry: pierwszy ustawia, czy ma być wyświetlony na konsoli skrypt SQL wygenerowany przez tą funkcję, drugi – czy zmiany mają być wykonane na bazie danych.

W wyniku wykonania tego kodu do bazy danych zostanie dodana tabela author.

Weryfikacja zgodności schematu bazy danych z modelem

Do kodu napisanego w powyższym przykładzie dopisz następującą linię.

Po wykonaniu tego kodu nic się nie dzieje… A w żadnej dokumentacji do hbm2ddl nie ma napisane co ma  się stać, a przynajmniej ja nie znalazłem 😉

Zobaczmy co się stanie po zmianie modelu, przed ostatnio dodaną linią dodajmy mapowanie obiektu Book do konfiguracji, czyli nasz kod wygląda teraz tak:

Po wykonaniu tego kodu widzimy jakiś efekt – poleciał wyjątek HibernateException z wiadomościa “Missing table: book”.

Podsumowując funkcja Validate() nie daje żadnego znaku jak jest wszystko OK, a rzuca wyjątek HibernateException, gdy obecny schemat bazy danych nie zgadza się z modelem.

Aktualizacja schematu do nowego modelu

Wiedząc już jak działa funkcja Validate() możemy dodać do naszego przykładu aktualizację schematu bazy danych jeśli się nie zgadza.

Zmodyfikujmy wywołanie funkcji Validate() tak, aby obsłużyć wyjątek:

W bloku catch wyświetlamy kilka informacji nt. wyjątku i aktualizujemy schemat bazy danych używając funkcji Execute na obiekcie SchemaUpdate. Funkcja Execute przyjmuje dwa parametry: pierwszy ustawia, czy ma być wyświetlony na konsoli skrypt SQL wygenerowany przez tą funkcję, drugi – czy zmiany mają być wykonane na bazie danych.

Usuwanie schematu z bazy danych

Posprzątajmy po naszej zabawie 🙂

Usuwamy schemat za pomocą funkcji Drop z klasy SchemaExport:

Funkcja Drop przyjmuje dwa parametry: pierwszy ustawia, czy ma być wyświetlony na konsoli skrypt SQL wygenerowany przez tą funkcję, drugi – czy zmiany mają być wykonane na bazie danych.

hbm2ddl a konfiguracja

hbm2ddl możemy z konfigurować w pliku hibernate.cfg.xml, wtedy odpowiednie akcje będą wykonane automatycznie podczas tworzenia SessionFactory.

Dodajmy do pliku hibernate.cfg.xml następującą linię:

Przy użyciu parametru “create” będzie podczas tworzenia SessionFactory będzie automatycznie wykonana funkcja: new SchemaExport(config).Create(false, true);

Pozostałe dostępne parametry to:

“create-drop” – to samo co create, tylko przy wywołaniu funkcji Close() and SessionFactory będzie automatycznie wykonana funkcja: new SchemaExport(config).Drop(false, true);

“update” – podczas tworzenia SessionFactory będzie automatycznie wykonana funkcja: new SchemaUpdate(config).Execute(false, true);

“validate” – podczas tworzenia SessionFactory będzie automatycznie wykonana funkcja: new SchemaValidator(config).Validate();

Podsumowanie

hbm2ddl to ciekawe narzędzie, które daje sporo możliwości, np.:

  • automatyczne tworzenie i aktualizowanie schematu bazy danych
  • generowanie skryptów do ręcznego dodawania zmian w bazie parametry funkcji (true, false)
  • weryfikacja poprawności mapowania model-baza
  • inicjowanie bazy do testów i czyszczenie jej po zakończeniu

Comments are closed.