1 Marcin Pamuła Mateusz StefekHibernate Marcin Pamuła Mateusz Stefek
2 Plan prezentacji 1. Wstęp 2. EJB i JDBC a Hibernate 3. Architektura4. Instalacja 5. Tworzenie najprostszej aplikacji hibernatowej 6. Możliwości Hibernata 7. Połączenie z Hibernata z JBOSSem 8 Podsumowanie
3 Wstęp Hibernate jest obiektowym narzędziem dostępu do bazy danych. Hibernate pozwala tworzyć klasy odpowiadające tabelkom w bazie danych. Umożliwia modelowanie relacji, dziedziczenia, polimorfizmu, kompozycji i kolekcji. W Hibernacie mamy możliwość wykonywania SQL-owych zapytań do bazy danych. Udostępnia też własny język zapytań (HQL), który dorównuje możliwościami SQL-owi, a przewyższa go pod względem przejrzystości.
4 EJB i JDBC a Hibernate JDBC – pozwala na wykonywanie poleceń SQL-owych z poziomu kodu JAVY Entity Java Beans – komponent EJB odpowiada pewnemu zbiorowi obiektów w bazie danych Dlaczego Hibernate jest wygodniejszy?
5 Architektura Hibernata
6 Architektura Hibernata
7 Instalacja Opis instalacji Hibernata:- instalacja bazy danych na przykładzie PostgreSQL ściągnięcie plików z klasami Hibernata ściągnięcie drivera JDBC do PostgreSQL konfiguracje
8 Tworzenie przykładowej aplikacji hibernatowejKlasy w Javie odpowiadające tabelkom XMLe z mapowaniami klas Konfiguracja Hibernata Tworzenie nowego obiektu i zapamiętanie go w bazie danych Wczytywanie obiektu z bazy danych Wykonywanie zapytań do bazy danych
9 Klasy w Javie odpowiadające tabelkompackage events; public class Person { private Long id; private int age; private String firstname; private String lastname; public Person() {} // Accessor methods for all properties, private setter for 'id' }
10 XMLe z mapowaniami klas
11 Konfiguracja Hibernata
12 Tworzenie nowego obiektu i zapamiętanie go w bazie danychprivate void createAndStoreEvent(String title, Date theDate) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate); session.save(theEvent); session.getTransaction().commit(); }
13 Wczytywanie obiektu z bazy danych i dokonywanie zmianprivate void loadAndUpdateEvent(Long personId, Long eventId, String t) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Event anEvent = (Event) session.load(Event.class, eventId); anEvent.setTitle(t); session.saveOrUpdate(anEvent); session.getTransaction().commit(); }
14 Wykonywanie zapytań do bazy danychprivate List listEvents() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List result = session.createQuery("from Event").list(); return result; }
15 Możliwości Hibernata W Hibernacie możemy zamodelować: KolekcjeKompozycje Dziedziczenie Dodatkowe możliwości: HQL Zapytania SQLowe Kryteria
16 Kolekcje
17 Kolekcje – relacja jeden do wielu
18 Kolekcje – relacja wiele do wielu
19 Kompozycje public class Person { private Name name;private String key; public String getKey() { return key; } private void setKey(String key) { this.key=key; public Name getName() { return name; public void setName(Name name) { this.name = name;
20 Kompozycje public class Name { String first; String last;public String getFirst() { return first; } void setFirst(String first) { this.first = first; public String getLast() { return last; void setLast(String last) { this.last = last;
21 Kompozycje
22 Dziedziczenie W Hibernacie mamy 3 sposoby na odwzorowaniedziedziczenia: Jedna tabela na klasę i klasy z niej dziedziczące Tabela na każdą klasę Tabela na każdą klasę nieabstrakcyjną
23 Tabela na schemat dziedziczenia
24 Tabela na każdą klasę
25 Tabela na każdą klasę nieabstrakcyjną
26 Hibernate Query Language (HQL)Hibernate jest wyposażony we własny, bardzo dobry język zapytań przypominający składnią SQL-a. Jednak w przeciwieństwie do niego, HQL jest językiem zorientowanym w pełni obiektowo, rozumiejącym mechanizmy dziedziczenia i polimorfizmu.
27 Hibernate Query Language (HQL)Składnia Złączenia Klauzula SELECT Klauzula WHERE Funkcje agregujące i operatory order by, group by podzapytania
28 Użycie HQLa List mothers = session.createQuery("select mother from Cat as cat join cat.mother as mother where cat.name = ?") .setString(0, name) .list(); List kittens = session.createQuery( "from Cat as cat where cat.mother = ?") .setEntity(0, pk)
29 Użycie HQLa Iterator results = sess.createQuery("select cat.color, min(cat.birthdate), count(cat) from Cat cat " + "group by cat.color") .list() .iterator(); while ( results.hasNext() ) { Object[] row = (Object[]) results.next(); Color type = (Color) row[0]; Date oldest = (Date) row[1]; Integer count = (Integer) row[2]; ..... }
30 Zapytania SQL-owe Zapytania nazwane w plikach z mapowaniami
31 Zapytania SQL-owe Zapytania w kodzie klasList cats = session.createSQLQuery( "SELECT {cat.*} FROM CAT {cat} WHERE ROWNUM<10", "cat", Cat.class ).list();
32 Kryteria Kryteria udostępniają programiście możliwośćdynamicznego budowania zapytań. Ułatwiają też abstrahowanie od języka zapytań. Kryteria udostępniają metodę list, która zwraca listę wyników List studenci = sess.createCriteria(Student.class).list()
33 Kryteria List studenci = sess.createCriteria(Student.class).add(Restrictions.like("imie", "M%")) .list() .add(Restrictions.sqlRestriction({alias}.imie like "M%"))
34 Kryteria List studenci = sess.createCriteria(Student.class).addOrder(Order.asc("imie") .list() List pracownicy = sess.createCriteria(Pracownik.class) .createCriteria("przelozony"). .add(Restriction.like("imie", "Z")
35 Połączenie Hibernata z JBossemChcemy tak skonfigurować serwer aplikacji, aby hibernate był dostępny jako usługa, a SessionFactory była widoczna w JNDI. Skonfigurowanie Jbossa, tak aby używał odpowiedniego drivera JDBC Skopiowanie plików cglib.jar, commons-collections.jar, commons-logging.jar, commons-lang.jar, jcs.jar,odmg.jar i hibernate.jar do ${HIBERNATE_HOME}/lib i ${JBOSS_HOME}/server/default/lib
36 Połączenie Hibernata z JBossemUtworzenie archiwum SAR o następującej strukturze: mojpakiet/Student.class mappings/Student.hbm.xml META-INF/jboss-service.xml
37 Połączenie Hibernata z JBossemJboss-service.xml
38 Połączenie Hibernata z JBossem
39 Podsumowanie Główną zaletą Hibernata, jest jego prostota iłatwość użycia. Dzięki niemu nie trzeba pisać setek poleceń w SQLu. Hibernate robi to za nas. Poza tym jest intuicyjny i łatwy do nauki. Wydaję się on być najlepszą technologią umożliwiającą dostęp do bazy danych, występującą obecnie na rynku.