Hibernate Podstawy
Plan wykładu Modelowanie relacyjno-obiektowe Klasy trwałe i encje Definiowanie relacji pomiędzy klasami trwałymi Wyszukiwanie danych
Relacyjne bazy danych - zalety Zarządzanie dużymi ilościami danych wyszukiwanie, sortowanie Zarządzanie grupami danych Łączenie, agregacja Współużytkowanie Współbieżność (transakcje) Integralność Więzy integralności Izolacja transakcji
Relacyjne bazy danych - wady Niezgodność modelu pojęciowego z modelem implementacyjnym Brak środków hermetyzacji i modularyzacji (brak oddzielenia implementacji od specyfikacji)
Technologie dostępu do bazy danych (I) JDBC Podstawowy interfejs dostępu do baz danych Ręczne kodowanie w JDBC uciążliwe i podatne na błędy SQLJ Naturalne zagnieżdżanie poleceń SQL w kodzie Java Odporna na błędy alternatywa dla bezpośredniego korzystania z JDBC Martwy standard
Technologie dostępu do bazy danych (II) Encyjne EJB 2.x Nienaturalne Złożone Biblioteka znaczników JSTL SQL Wygodna w prostych aplikacjach opartych na JSP Miesza logikę biznesową z logiką prezentacji, narusza model MVC Technologie odwzorowania obiektowo-relacyjnego Efektywnie mapują świat obiektów na świat relacyjnej bazy danych Najczęściej działają w warstwie webowej aplikacji
Mapowanie obiektowo-relacyjne Skorzystać z zalet relacyjnych baz danych Jednocześnie nie rezygnując z obiektowości
Java Persistance API Odejście od modelu relacyjnego na rzecz wygodnego i naturalnego obiektowego modelu danych Obiektowy język zapytań EJB QL Uniezależnienie się od bazy danych Podejście obiektowe : dziedziczenie, kolekcje, zależności Automatyczna obsługa transakcji wewnątrz kontenera EJB Wbudowane wsparcie dla optimistic lock Rezygnacja ze wzorca DTO Wykorzystanie adnotacji
Architektura
Konfiguracja <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN” "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@desyesb.oracle.dmcs.pl</property> <property name="hibernate.connection.password">admin</property> <property name="hibernate.connection.username">admin</property> <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> <mapping class=”przyklad.Uzytkownik" /> </session-factory> </hibernate-configuration>
SessionFactory Instancja org.hibernate.cfg.Configuration służy do zbudowania obiektu SessionFactory. SessionFactory przechowuje skompilowane mapowania oraz konfiguracje środowiska Hibernate dla pojedynczej bazy. SessionFactory jest dzielony pomiędzy wiele wątków. SessionFactory jest podstawą do stworzenia obiektu Session.
Session Session jest jednowątkowym obiektem reprezentującym dialog pomiędzy aplikacją, a bazą danych. Obiekt Session opakowuje połączenie JDBC. Sesja stanowi podstawową jednostkę pracy z Hibernatem. Session stanowi podstawę do stworzenia obiektu Transaction.
Synchronizacja bazą danych Session sessions = HibernateUtil.getSession(); sessions.getTransaction().begin(); List<Uzytkownik> list = sessions.createQuery("from Uzytkownik").list(); for (Uzytkownik u : list) System.out.println(u.getImie()); Uzytkownik u = new Uzytkownik(); u.setImie("jan"); sessions.persist(u); sessions.getTransaction().commit(); sessions.close();
Przykład – EJB3 public @Stateless class UzytkownikDAOBean implements UzytkownikDAO { @PersistenceContext(unitName = "PostgresU") private EntityManager entityManager; public Uzytkownik addNew() { Uzytkownik uzytkownik = new Uzytkownik(); uzytkownik.setImie(”Jan"); entityManager.persist(uzytkownik); return cust; }