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)