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;

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;

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-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 create a create-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();
}
}

Po wykonaniu się linii 23 (Zamknięcie SessionFactory) dokonuje się czyszczenie bazy danych. Tabela Dog przestaje istnieć.
Co w następnej części?
konfiugurowanie framerwoka w klasie (hibernate bez xml)
Zobacz listę szkoleń


