Marcin Pamuła Mateusz Stefek

1 Marcin Pamuła Mateusz StefekHibernate Marcin Pamuła Mat...
Author: Eustachy Schulz
0 downloads 2 Views

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 org.hsqldb.jdbcDriver jdbc:hsqldb:hsql://localhost sa 1 org.hibernate.dialect.HSQLDialect thread org.hibernate.cache.NoCacheProvider create

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 table="item_sizes" order-by="size asc">

17 Kolekcje – relacja jeden do wielu .... class="Parent" column="parent_id" not-null="true"/>

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 from eg.DomesticCat as cat where cat.name = ? and cat.weight > ? ] ]> Query q = sess.getNamedQuery("eg.DomesticCat.by.name.and.minimum.weight"); q.setString(0, name); q.setInt(1, minWeight); List cats = q.list();

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 jboss.jca:service=RARDeployer jboss.jca:service=LocalTxCM,name=MySqlDS mappings/Student.hbm.xml java:/hibernate/HibernateFactory java:/MySqlDS net.sf.hibernate.dialect.MySQLDialect

38 Połączenie Hibernata z JBossemnet.sf.hibernate.transaction.JTATransactionFactory net.sf.hibernate.transaction.JBossTransactionManagerLookup false false UserTransaction Po zdeplojowaniu wszystkie pisane przez nas komponenty mogą wyciąg SessionFactory z JNDI.

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.