Hibernate (podstawy)

Download Report

Transcript Hibernate (podstawy)

Odwzorowania relacyjno-obiektowe
Hibernate
Podstawy
Plan wykładu
•
•
•
•
Odwzorowania relacyjno-obiektowe
Modelowanie relacyjno-obiektowe
Klasy trwałe i encje
Definiowanie relacji pomiędzy klasami trwałymi
Wyszukiwanie danych
2
Odwzorowania relacyjno-obiektowe
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
3
Odwzorowania relacyjno-obiektowe
Relacyjne bazy danych - wady
• Niezgodność modelu pojęciowego z modelem
implementacyjnym
• Brak środków hermetyzacji i modularyzacji (brak
oddzielenia implementacji od specyfikacji)
4
Odwzorowania relacyjno-obiektowe
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
5
Odwzorowania relacyjno-obiektowe
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
6
Odwzorowania relacyjno-obiektowe
Mapowanie obiektowo-relacyjne
• Skorzystać z zalet relacyjnych baz danych
• Jednocześnie nie rezygnując z obiektowości
7
Odwzorowania relacyjno-obiektowe
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
8
Odwzorowania relacyjno-obiektowe
Architektura
9
Odwzorowania relacyjno-obiektowe
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>
10
Odwzorowania relacyjno-obiektowe
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.
11
Odwzorowania relacyjno-obiektowe
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.
12
Odwzorowania relacyjno-obiektowe
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();
13
Przykład – EJB3
Odwzorowania relacyjno-obiektowe
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;
}
}
14