Wirtualne przedsiębiorstwo II Mapowanie obiektowo-relacyjne z wykorzystaniem Hibernate Łukasz Macierzyński 157588 Daniel Nikończuk 157621 Kacper Oko 157626
Agenda 1. Co to jest mapowanie obiektowo-relacyjne (ORM)? 2. Relacyjne bazy danych kontra obiektowe. 3. Po co używać ORM? 4. Pierwsze kroki w Hibernate 5. Konfiguracja Hibernate a. Mapowanie za pomocą plików XML Mapowanie za pomocą adnotacji Javy 6. Prosty przykład. 7. Przykład w środowisku Eclipse. 8. Porównanie wydajności Hibernate a i JDBC. 9. Faktyczne działania Hibernate a. 10. Przykłady innych ORM. 11. Podsumowanie. 2/31
Cel wystąpienia Przedstawienie idei mapowania obiektowo-relacyjnego Zapoznanie słuchaczy z framework iem Hibernate Przedstawienie praktycznego zastosowania framework a Hibernate 3/31
Co to jest mapowanie obiektowo-relacyjne (ORM)? Mapowanie obiektowo-relacyjne (ang. Object-relational mapping) jest to konwertowanie danych z tabel w relacyjnej bazie danych na obiekty aplikacji klienckiej i na odwrót. Większość dzisiejszych aplikacji jest zorientowanych obiektowo, ale dane przechowuje się wciąż w relacyjnych bazach danych[1]. 4/31
Co to jest mapowanie obiektowo-relacyjne (ORM)? Rysunek 1. Mapowanie obiektowo-relacyjne[2]. 5/31
Relacyjne bazy danych kontra obiektowe bazy danych Relacyjne bazy danych są wciąż najbardziej popularne Obiektowe bazy danych nie są wystarczająco wspierane przez producentów SZBD Relacyjne bazy danych implementują szereg mechanizmów wspierających efektywną pracę 6/31
Po co używać ORM? Znaczne zredukowanie ilości pracy związanej z oprogramowaniem dostępu do danych Skorzystanie z zalet relacyjnych baz danych jednocześnie nie rezygnując z obiektowości programowania Uniezależnienie się od rodzaju DBMS a Automatyczna obsługa transakcji i pulą połączeń z bazą 7/31
Hibernate - ORM framework Hibernate - framework do realizacji warstwy dostępu do danych. Hibernate zwiększa wydajność operacji na bazie danych dzięki buforowaniu i minimalizacji liczby przesyłanych zapytań. Jest to projekt rozwijany jako open source. 8/31
Metody wytwarzania oprogramowania używając Hibernate a oraz Hibernate Tools Top down (dobre dla już istniejącego kodu) Zaimplementować model obiektowy Javy(JavaBeans) Napisać plik mapujący ręcznie lub wygenerować go używając adnotacji Wyeksportować tabele bazy danych używając Hibernate Tools Bottom up (dobre przy już istniejącej bazie) Zacząć z istniejącym modelem danych Użyć Hibernate Tools do wygenerowania plików mapujących Użyć Hibernate Tools do wygenerowania namiastek kodu Javy Wypełnić kod logiką biznesową Middle out (dobre przy nowym wytwarzaniu) Wyrazić konceptualny model obiektowy bezpośrednio przez plik mapujący Użyć Hibernate Tools do wygenerowania namiastek kodu Javy Wypełnić kod logiką biznesową Wyeksportować tabele bazy danych używając Hibernate Tools Meet in the middle (przy przesiadce z JDBC na Hibernate a) Zacząć z istniejącym modelem danych i istniejącymi klasami Javy Napisać plik mapujący łączący dwa modele 9/31
Używanie Hibernate a w kodzie Uzyskanie dostępu do obiektów persystentnych tak jak do normalnego obiektu POJO (Plain Old Java Object) Wykonywanie operacji DAO ( save, update, delete, etc.) do zapisywania zmian do bazy danych 10/31
Instalacja Hibernate a Najnowsza biblioteka Hibernate 3.5.1 http://www.hibernate.org/downloads.html lub poprzez Maven a. Biblioteki potrzebne do przedstawianego przykładu: org.hibernate:hibernate-core org.hibernate:hibernate-annotations org.hibernate:hibernate-commons annotations 11/31
Konfiguracja pliku hibernate.cfg.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="sesjehibernate" > <!-- local connection properties --> <property name="hibernate.connection.url">jdbc:localhost:1433</property> <property name="hibernate.connection.driver_class">driverdobazy</property> <property name="hibernate.connection.username">hibernateuser</property> <property name="hibernate.connection.password">hibernate123!</property> <!-- dialect for Microsoft SQL Server --> <property name="dialect">org.hibernate.dialect.sqlserverdialect</property> <property name="hibernate.show_sql">false</property> <property name="hibernate.transaction.factory_class"> org.hibernate.transaction.jdbctransactionfactory</property> </session-factory> </hibernate-configuration> 12/31
Klasa persytentna Plik Person.java: public class Person { private String name; private String surname; private int phonenumber; public Person {} } //gettery i settery Klasa persytentna musi być tzw. bean em. 13/31
Mapowanie za pomocą plików XML Plik Person.hbm.xml: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping 3.0.dtd"> <hibernate-mapping> <class name="person" table="persons"> <id name="id" type="int" column="id"> <generator class="increment"/> </id> <property name="name"/> <property name="surname" column="surname"/> <property name="phonenumber" column="phone_number </class> </hibernate-mapping> 14/31
Mapowanie za pomocą adnotacji Javy Plik Person.java: @Entity @Table(name = "Persons") public class Person { @Id @GeneratedValue @Column(name="id") private int id; @Column(name="name") private String name; @Column(name="surname") private String surname; @Column(name="phone_number") private int phonenumber; public Person() { } } //dalej gettery i settery 15/31
Po kolei w skrócie 1. Utworzenie pliku konfiguracyjnego i plików mapujących (lub adnotacji). 2. Utworzenie obiektu SessionFactory z obiektu Configuration. 3. Pobrać jedną sesje z SessionFactory. 4. Stworzyć zapytanie HQL. 5. Wykonać zapytanie dostając z powrotem np. listę obiektów javowych. 16/31
Przykład zapisu obiektu do bazy Person naszobiekt = new Person("Daniel", "Kowalski", 12312312); Session session = new Configuration().configure().buildSessionFactory().openSession(); Transaction t = session.begintransaction(); session.save(naszobiekt); t.commit(); session.close(); 17/31
Przykład odczytu Session session = new Configuration().configure().buildSessionFactory().openSession(); Query qry = session.createquery("from Person"); ArrayList<Person> persons = (ArrayList<Person>) qry.list(); session.close(); 18/31
HQL Hibernate Query Language Dający ogromne możliwości obiektowy język zapytań Hibernate tłumaczy HQL do SQL a Zapytania HQL są krótsze i bardziej czytelne niż odpowiedniki SQL 19/31
HQL Hibernate Query Language session.createquery( "from Person p where p.surname= :surname ). setstring("surname", "Kowalski"); session.createquery( "from Person p where p.phonenumber= :number ). setinteger( number", 11122233444"); 20/31
Przykład w środowisku Eclipse 21/31
Porównanie wydajności Ładowanie i wyświetlanie bitmapy Za pomocą Hibernate a Za pomocą JDBC Porównanie czasów wykonania pracy 22/31
Faktycznie działania Hibernate a Prezentacja audytów środowiska MS SQL Server 23/31
Zalety Hibernate a Dowolna klasa może reprezentować encje Wygodne i intuicyjne mapowanie z wykorzystaniem plików XML lub adnotacji (od Hibernate 3.0) Automatyczna optymalizacja = wydajność Mniej kodu = mniej błędów 24/31
Wady Hibernate a Posiada do tej pory wiele usterek Wsparcie techniczne i dokumentacja Hibernate a dostępna w Internecie jest niewystarczająca. Dla złożonych danych, mapowanie z obiektu do tabeli i vice versa zmniejsza wydajność i zwiększa czas konwersji. Hibernate nie pozwala używać niektórych zapytań, które są dostępne w JDBC, np. nie pozwala wstawiać wiele obiektów do tej samej tabeli używając jednego zapytania. 25/31
Hibernate czy zawsze warto? Używanie Hibernate a jest przesąda dla aplikacji, które: są proste i używają jednej bazy danych, która nigdy się nie zmieni wstawiają dane bezpośrednio do tabel, poza tym nie używa żadnych innych zapytań SQL nie ma w niej żadnych obiektów, które są zmapowane na dwie rożne tabele Hibernate w takim przypadku zwiększa niepotrzebnie liczbę warstw i złożoność aplikacji. Dla takich aplikacji najlepszym wyborem jest JDBC. 26/31
Przykłady innych ORM Java TopLink (Oracle) EclipseLink, ibatis Java Data Objects (JDO) Java Persistence API (JPA) Torque Cayenne Carbonado Enterprise Objects Framework, (MAC OS X) KeyAccess 27/31
Przykłady innych ORM cd..net NHibernate Entity Framework by Microsoft SubSonic NetTiers CodeSmith LINQ to SQL ObjectMapper.NET ibatis własny ORM 28/31
Podsumowanie Używanie framework ów ORM daje mnóstwo korzyści, lecz nie zawsze warto ich używać Hibernate jest jednym z najpopularniejszych framework ów ORM (Java oraz.net) chociaż nie jest wolny od wad Hibernate wspiera wiele narzędzi dla różnych środowisk (Ant, Maven, narzędzia Eclipse a) 29/31
Bibliografia 1. http://www.pcmag.com/encyclopedia_term/0,2542,t=objec t-relational+mapping&i=55645,00.asp (2010-04-20) 2. http://ms-groups.pl/tgnet/materiay2/ból Andrzej 'ENTITY FRAMEWORK W PRAKTYCE'/Andrzej_Bol_Entity Framework 3.ppt (2010-04-20) 3. http://lux.dmcs.pl/oro/wykladh1.ppt (2010-04-20) 4. http://confluence.sakaiproject.org/download/attachments/ 44794065/PersistenceHibernate.ppt (2010-04-21) 5. http://biblestudygroupatlas.googlecode.com/files/hibernate -1x2.pdf (2010-04-21) 30/31
Pytania 31/31