Bazy danychORM

Hibernate #3 – Strategie zarządzania schematem bazy danych

hibernate

Hibernate dostarcza możliwości korzystania schematem bazy danych.
Do dyspozycji są 4 strategie:

  • validate
  • update
  • create
  • create-drop

Strategie definiuje się w pliku hibernate.cfg.xml poprzez dodanie wpisu z odpowiednią strategią np.:

<property name="hibernate.hbm2ddl.auto">update</property>

validate

  • Sprawdź poprawność schematu;
  • nie wprowadza żadnych zmian w bazie danych;
  • jeśli struktura bazy danych nie istnieje, to go nie utworzy;
  • w przypadku braku tabel rzuci błąd Table not found:<table name>;
  • sprawdza czy kolumny pokrywają się z polami i w przypadku niepowodzenia zgłasza błąd;
  • zalecana strategia do stosowania na instancji produkcyjnej;
Błąd otrzymywany w przypadku niepokrywającego się schematu bazy danych z encją JPA.
Błąd otrzymywany w przypadku niepokrywającego się schematu bazy danych z encją JPA.

update

  • Jeśli schemat bazy danych nie istnieje to go utworzy;
  • w przypadku kiedy schemat bazy danych jest rozbieżny z encjami JPA, to dokona się aktualizacja tabel;
  • aktualizacja tabel tworzy jedynie nowe kolumny. W przypadku kiedy w encji JPA zostanie usunięte pole, to update nie usunie kolumny do której to pole nawiązywało;
  • nie usuwa istniejących rekordów znajdujących się w bazie;
  • w przypadku rozszerzenia istniejącej tabeli o nową kolumnę, to istniejące wpisy w DB zostaną uzupełnione w tej kolumnie wartością NULL;
Dodanie nowej kolumny surname - dokonała się aktualizacja bazy danych, a istniejące rekordy uzyskały wartości NULL w nowej kolumnie.
Dodanie nowej kolumny surname – dokonała się aktualizacja bazy danych, a istniejące rekordy uzyskały wartości NULL w nowej kolumnie.

create

  • Jeśli baza danych nie istnieje, to utworzy ją;
  • za każdym razem usuwa schemat bazy danych, wraz z rekordami;
  • usuwanie schematu nawiązuje tylko do tych tabel, które mają powiązanie z encjami JPA.

Przykładowo wykonanie kodu dodającego dwa elementy do bazy danych jak widoczne to jest w  kodzie poniżej zaskakujące finalnie zapisaniem tylko jednego elementu, ponieważ przed stworzeniem nowej instancji Session wykona się utworzenie nowego schematu.

public static void main(String[] args) {
    DogDao dogDao = new DogDao();
    Dog dog = new Dog();
    dog.setName("Pucek");
    dog.setAge(3);
    dogDao.addDog(dog);
}

public void addDog(Dog dog) {
    Session session = hibernateFactory.getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();
    try {
        session.save(dog);
        session.getTransaction().commit();
    } catch (Exception ex) {
        transaction.rollback();
        ex.printStackTrace();
        throw new RuntimeException(ex);
    } finally {
        session.close();

    }
}
create
Jeden wpis mimo dwukrotnego dodania.

create-drop

  • Jeśli baza danych nie istnieje, to utworzy ją;
  • usuwa schemat bazy danych, wraz z rekordami w momencie zamknięcia SessionFactory.
  • usuwanie schematu nawiązuje tylko do tych tabel, które mają powiązanie z encjami JPA.
  • przeważnie wykorzystywany do testów jednostkowych/integracyjnych.
  • zasadniczą różnicą między createcreate-drop jest to, że create tworzy nowy schemat bazy danych za każdym razem przed powołaniem instancji Session, natomiast create-drop usuwa schemat bazy danych po wywołaniu metody close() na obiekcie SessionFactory;
public static void main(String[] args) {
    DogDao dogDao = new DogDao();
    System.out.println("--- add dog ---");
    Dog dog = new Dog();
    dog.setName("Pucek");
    dog.setAge(3);
    dogDao.addDog(dog);
    dogDao.addDog(dog);
}

public void addDog(Dog dog) {
    Session session = hibernateFactory.getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();
    try {
        session.save(dog);
        session.getTransaction().commit();
    } catch (Exception ex) {
        transaction.rollback();
        ex.printStackTrace();
        throw new RuntimeException(ex);
    } finally {
        session.close();
        hibernateFactory.getSessionFactory().close();
    }
}
Stan bazy danych przed wykonaniem się linii 23.
Stan bazy danych przed wykonaniem się linii 23.

Po wykonaniu się linii 23 (Zamknięcie SessionFactory) dokonuje się czyszczenie bazy danych. Tabela Dog przestaje istnieć.

Co w następnej części?

Opis związków między relacjami – jeden do jednego.

Cały kurs opisujący mechanikę i działanie Frameworka Hibernate od podstaw znajdziesz tutaj: Kurs Hibernate
Tags:
Show Buttons
Hide Buttons