Mapowanie obiektowo-relacyjne z Mapowanie obiektowo
Transkrypt
Mapowanie obiektowo-relacyjne z Mapowanie obiektowo
Wirtualne przedsiębiorstwo II Mapowanie obiektowo-relacyjne z wykorzystaniem Hibernate Łukasz Macierzyński 157588 Daniel Nikończuk 157621 Kacper Oko 157626 Agenda 1. 2. 3. 4. 5. Co to jest mapowanie obiektowo-relacyjne (ORM)? Relacyjne bazy danych kontra obiektowe. Po co używać ORM ? Pierwsze kroki w Hibernate 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 obiektowoobiektowo-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. 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: 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: 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: 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