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

Podobne dokumenty