42
MSI – dr. Inż. Mariusz Trzaska Wyklad 13 Wyklad 13 Wykorzystanie modelu relacyjnego w Wykorzystanie modelu relacyjnego w obiektowych językach programowania (2) obiektowych językach programowania (2) Wykorzystanie modelu relacyjnego w Wykorzystanie modelu relacyjnego w obiektowych językach programowania (2) obiektowych językach programowania (2)

MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

  • Upload
    doanque

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

MSI – dr. Inż. Mariusz Trzaska

Wykład 13Wykład 13Wykorzystanie modelu relacyjnego w Wykorzystanie modelu relacyjnego w

obiektowych j ęzykach programowania (2)obiektowych j ęzykach programowania (2)Wykorzystanie modelu relacyjnego w Wykorzystanie modelu relacyjnego w

obiektowych j ęzykach programowania (2)obiektowych j ęzykach programowania (2)

Page 2: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

ZagadnieniaZagadnienia

oo Niezgodność impedancji i jej konsekwencjeNiezgodność impedancji i jej konsekwencjeoo Różne sposoby rozwiązania problemuRóżne sposoby rozwiązania problemuoo Microsoft LINQMicrosoft LINQoo HibernateHibernate

�� Wprowadzenie,Wprowadzenie,�� Mapowanie obiektów,Mapowanie obiektów,�� Mapowanie asocjacji,Mapowanie asocjacji,�� Mapowanie asocjacji,Mapowanie asocjacji,

�� Mapowanie atrybutów powtarzalnych.Mapowanie atrybutów powtarzalnych.

oo PodsumowaniePodsumowanie

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 22

Page 3: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Niezgodność impedancjiNiezgodność impedancji

oo Łączenie:Łączenie:�� modelu obiektowego zmodelu obiektowego z języka programowania,języka programowania,�� modelu relacyjnego modelu relacyjnego ze składu danychze składu danych�� modelu relacyjnego modelu relacyjnego ze składu danychze składu danych

skutkuje zjawiskiem zwanym niezgodnością skutkuje zjawiskiem zwanym niezgodnością impedancji.impedancji.

// [...] // Wykonaj zapytanie ResultSet result = db_statement.executeQuery("selec t * from employee"); // Przetwarzanie wynikow while (result.next() ) {

W efekcie zamiast operować na obiektach (np. Pracownik) działamy w W efekcie zamiast operować na obiektach (np. Pracownik) działamy w oparciu o ich elementy, np. oparciu o ich elementy, np. StringString z nazwiskiem.z nazwiskiem.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 33

{ System.out.println ("ID : " + result.getInt("ID")) ; System.out.println ("Name : " + result.getString(" Name")); }

Page 4: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Niezgodność impedancji (2)Niezgodność impedancji (2)

oo Rozwiązania problemuRozwiązania problemu�� Stosowanie tego samego modelu w języku Stosowanie tego samego modelu w języku

programowania oraz źródle danych.programowania oraz źródle danych.programowania oraz źródle danych.programowania oraz źródle danych.•• Mało kto zdecyduje się na programowanie w modelu Mało kto zdecyduje się na programowanie w modelu

relacyjnym (programowanie strukturalne).relacyjnym (programowanie strukturalne).•• Można wprowadzić istotne udogodnienia z zakresu Można wprowadzić istotne udogodnienia z zakresu

baz danych do języka programowania m. in. język baz danych do języka programowania m. in. język zapytań.zapytań.

�� Microsoft C# 3.0 i LINQMicrosoft C# 3.0 i LINQ

�� Wykorzystanie dedykowanych bibliotek, np. Wykorzystanie dedykowanych bibliotek, np. HibernateHibernate..

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 44

Page 5: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

LINQLINQ

oo LLanguage anguage InIntegrated tegrated QQueryueryoo Autorem tej technologii jest Autorem tej technologii jest

Anders Anders HejlsbergHejlsberg, który jako , który jako Anders Anders HejlsbergHejlsberg, który jako , który jako pierwszy stworzył IDE (pierwszy stworzył IDE (BorlandBorland Turbo Pascal).Turbo Pascal).

oo Wprowadzenie LINQ porównywane jest do Wprowadzenie LINQ porównywane jest do przełomu spowodowanego przez dBase oraz przełomu spowodowanego przez dBase oraz FoxPro.FoxPro.

oo Do istniejącego języka programowania (m. in. MS Do istniejącego języka programowania (m. in. MS C#) dodano składnię i funkcjonalność umożliwiającą C#) dodano składnię i funkcjonalność umożliwiającą pisanie zapytań podobnych do SQL.pisanie zapytań podobnych do SQL.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 55

Page 6: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

LINQ (2)LINQ (2)oo Dzięki temu problem niezgodności impedancji po prostu Dzięki temu problem niezgodności impedancji po prostu

znika!znika!oo Dodatkowe korzyści:Dodatkowe korzyści:

�� Wykorzystanie Wykorzystanie metadanychmetadanych czasu wykonania,czasu wykonania,�� Kontrola typologiczna Kontrola typologiczna

w czasie kompilacji,w czasie kompilacji,�� Wykorzystanie Wykorzystanie

IntelliSenseIntelliSense®,®,�� DLinqDLinq używany do używany do

tłumaczenia na SQL,tłumaczenia na SQL,tłumaczenia na SQL,tłumaczenia na SQL,�� XLinqXLinq –– kwerendy XML.kwerendy XML.

oo Wsparcie ze strony np. Wsparcie ze strony np.

IBM DB2, Informix IDS.IBM DB2, Informix IDS.oo Rewolucja?Rewolucja?

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 66

Page 7: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

LINQ (3)LINQ (3)

oo PrzykładyPrzykładyvar locals = from c in customers

where c.ZipCode == 91822select new { FullName = c.FirstName + “ “ +select new { FullName = c.FirstName + “ “ +

c.LastName, HomeAddress = c.Address };

IEnumerable<Product> x =from p in productswhere p.UnitPrice >= 10select p;

IEnumerable<Product> MostExpensive10 =products.OrderByDescending(p => p.UnitPrice).Take(1 0);

var custOrders =

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 77

var custOrders =from c in customersjoin o in orders on c.CustomerID equals o.CustomerI Dselect new { c.Name, o.OrderDate, o.Total };

IEnumerable<Product> orderedProducts1 =from p in productsorderby p.Category, p.UnitPrice descending, p.Nameselect p;

Page 8: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

LINQ (4)LINQ (4)

oo Przykłady Przykłady –– c. d.c. d.var q =

from c in db.Customerswhere c.City == "London"where c.City == "London"select c;

foreach ( Customer c in q)Console.WriteLine(c.CompanyName);

var q =from o in db.Orders

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 88

from o in db.Orderswhere o.ShipVia == 3select o;

foreach ( Order o in q) {if (o.Freight > 200)

SendCustomerNotification(o.Customer);ProcessOrder(o);

}

Page 9: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

LINQ (5)LINQ (5)

oo Aktualnie na etapie beta:Aktualnie na etapie beta:oo Można pobrać Można pobrać Visual Studio Visual Studio OrcasOrcas Beta 1 Beta 1

ze stron MSDN. Dostępne jako:ze stron MSDN. Dostępne jako:ze stron MSDN. Dostępne jako:ze stron MSDN. Dostępne jako:�� Obraz wirtualnej maszyny Obraz wirtualnej maszyny VirtualPCVirtualPC,,�� Klasyczny instalator.Klasyczny instalator.

http://blogs.msdn.com/charlie/archive/2007/04/19/visualhttp://blogs.msdn.com/charlie/archive/2007/04/19/visual--studiostudio--orcasorcas--betabeta--11--available.aspxavailable.aspx

oo Więcej informacji na stronach MSDNWięcej informacji na stronach MSDNoo Więcej informacji na stronach MSDNWięcej informacji na stronach MSDN�� http://msdn2.microsoft.com/http://msdn2.microsoft.com/enen--usus//netframeworknetframework/aa904594.aspx/aa904594.aspx

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 99

Page 10: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

HibernateHibernate

oo Zgodnie z informacją twórców Zgodnie z informacją twórców HibernateHibernate to:to:�� Hibernate is a powerful, high performance Hibernate is a powerful, high performance

object/relational persistence and query serviceobject/relational persistence and query serviceobject/relational persistence and query serviceobject/relational persistence and query service�� Wydajna usługa zapewniająca trwałość danych oraz Wydajna usługa zapewniająca trwałość danych oraz

umożliwiająca zadawanie zapytań.umożliwiająca zadawanie zapytań.

oo Istnieją wersje dla Istnieją wersje dla Java oraz MS .NET.Java oraz MS .NET.

oo Projekt rozwijany jako Projekt rozwijany jako openopen sourcesource od roku 2001:od roku 2001:�� 76 000 linii kodu 76 000 linii kodu corecore,,�� 76 000 linii kodu 76 000 linii kodu corecore,,

�� 36 000 linii kodu 36 000 linii kodu unit test,unit test,�� 3000 pobrań każdego dnia.3000 pobrań każdego dnia.

oo http://www.hibernate.org/http://www.hibernate.org/

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1010

Page 11: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

HibernateHibernate (2)(2)

oo Niestety nie likwiduje całkowicie problemu Niestety nie likwiduje całkowicie problemu niezgodności impedancji.niezgodności impedancji.Aktualna wersja 3.xAktualna wersja 3.xoo Aktualna wersja 3.xAktualna wersja 3.x

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1111

Page 12: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

HibernateHibernate -- wydajnośćwydajność

oo Twórcy twierdzą, że biblioteka jest wydajna i Twórcy twierdzą, że biblioteka jest wydajna i wykorzystuje różne techniki optymalizacji:wykorzystuje różne techniki optymalizacji:

Cache’owanieCache’owanie obiektów,obiektów,�� Cache’owanieCache’owanie obiektów,obiektów,�� Cache’owanieCache’owanie wyników zapytań,wyników zapytań,�� Polecenia SQL wykonywane dopiero wtedy gdy Polecenia SQL wykonywane dopiero wtedy gdy

są naprawdę potrzebne,są naprawdę potrzebne,�� Brak uaktualniania niezmodyfikowanych Brak uaktualniania niezmodyfikowanych

obiektów,obiektów,obiektów,obiektów,�� Efektywne zarządzanie kolekcjami,Efektywne zarządzanie kolekcjami,�� Łączenie wielu zmian w jedno UPDATE,Łączenie wielu zmian w jedno UPDATE,�� Leniwa inicjalizacja obiektów i kolekcji.Leniwa inicjalizacja obiektów i kolekcji.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1212

Page 13: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

HibernateHibernate -- środowisko testoweśrodowisko testowe

oo Bazujemy na oficjalnym Bazujemy na oficjalnym tutorialututorialu::http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.htmlhttp://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html

oo HibernateHibernate domyślnie działa w oparciu o bazę domyślnie działa w oparciu o bazę danych poprzez JDBC.danych poprzez JDBC.

oo Wykorzystamy bazę HSQL (Wykorzystamy bazę HSQL (http://hsqldb.org/http://hsqldb.org/) ) napisaną w całości w języku Java.napisaną w całości w języku Java.Utworzenie katalogu z bibliotekami Utworzenie katalogu z bibliotekami liblib..oo Utworzenie katalogu z bibliotekami Utworzenie katalogu z bibliotekami liblib..

oo Uruchomienie (z katalogu data)Uruchomienie (z katalogu data)javajava --classpathclasspath ../ ../liblib//hsqldb.jarhsqldb.jar org.hsqldb.Serverorg.hsqldb.Server

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1313

Page 14: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Podstawy biblioteki Podstawy biblioteki HibernateHibernate

oo Stworzymy prostą aplikację umożliwiającą:Stworzymy prostą aplikację umożliwiającą:�� planowanie zdarzeń,planowanie zdarzeń,�� Łączenie zdarzeń z uczestnikami.Łączenie zdarzeń z uczestnikami.�� Łączenie zdarzeń z uczestnikami.Łączenie zdarzeń z uczestnikami.

oo Każda klasa, która chce wykorzystywać pełnię Każda klasa, która chce wykorzystywać pełnię możliwości biblioteki, musi posiadać specyficzny możliwości biblioteki, musi posiadać specyficzny atrybut służący do identyfikacji wystąpień.atrybut służący do identyfikacji wystąpień.�� privateprivate long id;long id;

�� Zmianą jego wartości zajmuje się Zmianą jego wartości zajmuje się HibernateHibernate..�� Zmianą jego wartości zajmuje się Zmianą jego wartości zajmuje się HibernateHibernate..

oo Zalecane wykorzystywanie konwencji Zalecane wykorzystywanie konwencji JavaBeanJavaBean�� set…(),set…(),

�� getget…()…() ..

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1414

Page 15: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Podstawy biblioteki Podstawy biblioteki HibernateHibernate (2)(2)public class Event {

private Long id ;private String title ;private Date date ;public Event() {}

public Long getId() {return id ;

}private void setId(Long id) {

this . id = id;}public Date getDate() {

return date ;}public void setDate(Date date) {

this . date = date;

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1515

this . date = date;}public String getTitle() {

return title ;}public void setTitle(String title) {

this . title = title;}

}

Page 16: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Plik mapującyPlik mapujący

oo Wykorzystywany do mapowania klas języka Java Wykorzystywany do mapowania klas języka Java ((modelmodel obiektowy) na elementy w bazie danych obiektowy) na elementy w bazie danych ((modelmodel relacyjny).relacyjny).((modelmodel relacyjny).relacyjny).

oo Nazwa: Nazwa: NazwaKlasyNazwaKlasy.hbm.xml.hbm.xml

oo Lokalizacja: w tym samym katalogu co Lokalizacja: w tym samym katalogu co odpowiadający mu plik źródłowy odpowiadający mu plik źródłowy NazwaKlasyNazwaKlasy.java.java ..

<?xml version =" 1.0 " ?>

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1616

<?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="events.Event" table ="EVENTS“>[...]</ class >

</ hibernate-mapping >

Page 17: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Plik mapujący (2)Plik mapujący (2)

oo Tag Tag classclass�� namename oznacza nazwę klasy języka Java,oznacza nazwę klasy języka Java,

informuje w jakiej tabeli przechowywać informuje w jakiej tabeli przechowywać �� tabletable informuje w jakiej tabeli przechowywać informuje w jakiej tabeli przechowywać wystąpienia tej klasy.wystąpienia tej klasy.

<?xml version =" 1.0 " ?><!DOCTYPE hibernate-mapping PUBLIC

" - //Hibernate/Hibernate Mapping DTD 3.0//EN"

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1717

" - //Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping -3.0.dtd" >

<hibernate-mapping ><class name="events.Event" table ="EVENTS“>[...]</ class >

</ hibernate-mapping >

Page 18: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Plik mapujący (3)Plik mapujący (3)

oo Tag Tag idid służy do tworzenia identyfikatorów służy do tworzenia identyfikatorów (kluczy) (kluczy)

namename oznacza nazwę atrybutu klasy języka Java,oznacza nazwę atrybutu klasy języka Java,�� namename oznacza nazwę atrybutu klasy języka Java,oznacza nazwę atrybutu klasy języka Java,�� column column informuje w której kolumnie informuje w której kolumnie

przechowywać jego wartości.przechowywać jego wartości.�� generator generator określa strategię zapewniania określa strategię zapewniania

unikalności liczb.unikalności liczb.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1818

<class name="events.Event" table ="EVENTS"><id name="id" column ="EVENT_ID" >

<generator class ="native" /></ id ><property name="date" type ="timestamp" column ="EVENT_DATE"/><property name="title" />

</ class >

Page 19: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Plik mapujący (4)Plik mapujący (4)

oo Tag Tag property property mapuje atrybuty.mapuje atrybuty.�� typetype definiuje typ kolumny. Należy go użyć gdy definiuje typ kolumny. Należy go użyć gdy

nie da się tego „odgadnąć” automatycznie, np. nie da się tego „odgadnąć” automatycznie, np. nie da się tego „odgadnąć” automatycznie, np. nie da się tego „odgadnąć” automatycznie, np. java.util.Datejava.util.Date może być przedstawione jako może być przedstawione jako SQLSQL

•• datedate , , •• TimestampTimestamp ,,•• timetime ..

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 1919

<class name="events.Event" table ="EVENTS"><id name="id" column ="EVENT_ID" >

<generator class ="native" /></ id ><property name="date" type ="timestamp" column ="EVENT_DATE"/><property name="title" />

</ class >

Page 20: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Plik konfiguracyjnyPlik konfiguracyjny

oo Lokalizacja: główny katalog z plikami źródłowymiLokalizacja: główny katalog z plikami źródłowymi

<?xml version =' 1.0 ' encoding ='utf-8' ?><!DOCTYPE hibernate - configuration PUBLIC<!DOCTYPE hibernate - configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configu ration-3.0.dtd" >

<hibernate-configuration ><session-factory >

<!-- Database connection settings --><property name="connection.driver_class" >org.hsqldb.jdbcDriver</ property ><property name="connection.url" >jdbc:hsqldb:hsql://localhost</ property ><property name="connection.username" >sa</ property ><property name="connection.password" ></ property ><!-- JDBC connection pool (use the built-in) --><property name="connection.pool_size" >1</ property ><!-- SQL dialect --><property name="dialect" >org.hibernate.dialect.HSQLDialect</ property ><! -- Enable Hibernate's automatic session context manage ment -- >

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2020

<! -- Enable Hibernate's automatic session context manage ment -- ><property name="current_session_context_class" >thread</ property ><!-- Disable the second-level cache --><property name="cache.provider_class" >org.hibernate.cache.NoCacheProvider</ property ><!-- Echo all executed SQL to stdout --><property name="show_sql" >true</ property ><!-- Drop and re-create the database schema on start up --><!-- <property name="hbm2ddl.auto">create</property> --><mapping resource ="events/Event.hbm.xml" />

</ session-factory ></ hibernate-configuration >

Page 21: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Klasa pomocniczaKlasa pomocnicza

oo Uruchomienie Uruchomienie HibernateHibernateoo Globalny obiekt Globalny obiekt SessionFactorySessionFactory ,,

Bezpieczna obsługa wielu wątków,Bezpieczna obsługa wielu wątków,�� Bezpieczna obsługa wielu wątków,Bezpieczna obsługa wielu wątków,�� Tworzy pojedyncze sesje: Tworzy pojedyncze sesje: SessionSession . . public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {try {

// Create the SessionFactory from hibernate.cfg.xmlsessionFactory = new Configuration().configure().buildSessionFactory();

} catch (Throwable ex) {

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2121

} catch (Throwable ex) {// Make sure you log the exception, as it might be swallowedSystem. err.println("Initial SessionFactory creation failed." + ex);throw new ExceptionInInitializerError(ex);

}}

public static SessionFactory getSessionFactory() {return sessionFactory;

}}

Page 22: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Pierwsze użycie Pierwsze użycie HibernateHibernate

oo Dodajemy proste wydarzenie „Zdarzenie 01” z Dodajemy proste wydarzenie „Zdarzenie 01” z aktualną datą.aktualną datą.public class EventManager {public class EventManager {

public static void main(String[] args) {EventManager mgr = new EventManager();

mgr. createAndStoreEvent ( „ Zdarzenie 01 " , new Date());

HibernateUtil. getSessionFactory().close();}

private void createAndStoreEvent (String title, Date theDate ) {

Session session = HibernateUtil. getSessionFactory().getCurrentSession();

session.beginTransaction();

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2222

Event theEvent = new Event();theEvent.setTitle(title);theEvent.setDate(theDate);

session.save(theEvent);

session.getTransaction().commit();}

}

Page 23: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Pierwsze użycie Pierwsze użycie HibernateHibernate (2)(2)

oo Efekt działania możemy podejrzeć w pliku Efekt działania możemy podejrzeć w pliku loglog..20:24:36,897 DEBUG SchemaExport:303 - create table E VENTS (EVENT_ID bigint generated by default as identity (start with 1), EVENT_DATE timestamp, titl e varchar(255), primary key (EVENT_ID))

20:24:36,975 DEBUG ConnectionManager:421 - opening J DBC connection

20:24:36,975 DEBUG AbstractSaveEventListener:153 - saving [events.Event#<null>]20:24:36,975 DEBUG AbstractSaveEventListener:244 - e xecuting insertions20:24:36,991 DEBUG AbstractSaveEventListener:297 - executing identity-insert immediately20:24:36,991 DEBUG AbstractEntityPersister:2144 - Inserting entity: events.Event (native id)20:24:36,991 DEBUG AbstractBatcher:366 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)20:24:36,991 DEBUG SQL:401 - insert into EVENTS (EVE NT_DATE, title, EVENT_ID) values (?, ?, ?)Hibernate: insert into EVENTS (EVENT_DATE, title, EVENT_ID) values (?, ?, ?)20:24:36,991 DEBUG AbstractBatcher:484 - preparing statement20:24:36,991 DEBUG AbstractEntityPersister:1992 - Dehydrating entity: [events.Event#<null>]20:24:36,991 DEBUG AbstractBatcher:374 - about to close PreparedStatement (open PreparedStatements: 1,

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2323

20:24:36,991 DEBUG AbstractBatcher:374 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)20:24:36,991 DEBUG AbstractBatcher:533 - closing statement20:24:36,991 DEBUG AbstractBatcher:366 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)20:24:36,991 DEBUG SQL:401 - call identity()Hibernate: call identity()20:24:37,007 DEBUG ThreadLocalSessionContext:300 - allowing proxied method [getTransaction] to proceed to real session20:24:37,007 DEBUG JDBCTransaction:103 – commit

Page 24: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Pobieranie danych poprzez Pobieranie danych poprzez HibernateHibernate

oo Po „wygenerowaniu” danych, należy Po „wygenerowaniu” danych, należy zakomentowaćzakomentowaćfragment pliku fragment pliku hibernate.cfg.xmlhibernate.cfg.xml (w przeciwnym (w przeciwnym wypadku dane będą usuwane)wypadku dane będą usuwane)wypadku dane będą usuwane)wypadku dane będą usuwane)

oo Metoda pobierające „ekstensję” klasy Metoda pobierające „ekstensję” klasy EventEvent (za (za pomocą zapytania HQL)pomocą zapytania HQL)

<!-- Drop and re-create the database schema on startup --><!-- <property name="hbm2ddl.auto">create</property> -->

private List listEvents() {

Session session = HibernateUtil. getSessionFactory().getCurrentSession();

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2424

Session session = HibernateUtil. getSessionFactory().getCurrentSession();

session.beginTransaction();

List result = session.createQuery( "from Event" ).list();

session.getTransaction().commit();

return result;}

Page 25: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Pobieranie danych poprzez Pobieranie danych poprzez HibernateHibernate (2)(2)

oo Wykorzystanie metody do pobierania danychWykorzystanie metody do pobierania danychEventManager mgr = new EventManager();

List events = mgr.listEvents();

oo Jak widać pracujemy na kompletnych obiektach, a Jak widać pracujemy na kompletnych obiektach, a

List events = mgr.listEvents();

for ( int i = 0; i < events.size(); i++) {Event theEvent = (Event) events.get(i);

System. out.println("Event: " + theEvent.getTitle() + " Time: "+ theEvent.getDate());

}

HibernateUtil. getSessionFactory().close();

oo Jak widać pracujemy na kompletnych obiektach, a Jak widać pracujemy na kompletnych obiektach, a nie (jak w przypadku „czystego JDBC) na nie (jak w przypadku „czystego JDBC) na wartościach (np. wartościach (np. StringString ) z bazy danych.) z bazy danych.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2525

Page 26: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Asocjacje w Asocjacje w HibernateHibernate

oo Asocjacje są (prawie) automatycznie Asocjacje są (prawie) automatycznie mapowane na relacje w bazie danych.mapowane na relacje w bazie danych.

oo Elementy, które trzeba uwzględnić to:Elementy, które trzeba uwzględnić to:�� Kierunek,Kierunek,�� Liczności,Liczności,�� Zachowanie się kolekcji służącej do Zachowanie się kolekcji służącej do �� Zachowanie się kolekcji służącej do Zachowanie się kolekcji służącej do

implementacji (po stronie Javy).implementacji (po stronie Javy).

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2626

Page 27: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Dodanie asocjacji skierowanejDodanie asocjacji skierowanej

oo Stworzymy klasę Osoba (Stworzymy klasę Osoba (PersonPerson) i powiążemy ją z ) i powiążemy ją z wydarzeniami (wydarzeniami (EventsEvents).).

public class Person {private Long id ;

oo Plik mapujący dla klasy Plik mapujący dla klasy PersonPerson

private Long id ;private int age ;private String firstname ;private String lastname ;

public Person() {}// Metody get/set oraz prywatny set dla id.

}

<class name= "events.Person" table="PERSON" ><id name= "id" column="PERSON_ID" >

oo Nowy wpis do pliku konfiguracyjnego.Nowy wpis do pliku konfiguracyjnego.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2727

<generator class= "native" /></id><property name= "age" /><property name= "firstname" /><property name= "lastname" />

</class>

Page 28: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Dodanie asocjacji skierowanej (2)Dodanie asocjacji skierowanej (2)

oo Do klasy Do klasy PersonPerson dodamy informację o jej wydarzeniach dodamy informację o jej wydarzeniach ((EventsEvents).).

public class Person {// [...]

oo I uzupełnimy plik mapujący dla klasy I uzupełnimy plik mapujący dla klasy PersonPerson

// [...]private Set events = new HashSet ();public Set getEvents() {

return events ;}public void setEvents(Set events) {

this . events = events;}

<class name= "events.Person" table="PERSON" >[…]<set name= "events" table="PERSON_EVENT" >

oo Wykorzystaliśmy pojemnik typu Wykorzystaliśmy pojemnik typu SetSet (obsługiwane są też (obsługiwane są też inne).inne).

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2828

<set name= "events" table="PERSON_EVENT" ><key column= "PERSON_ID" /><many-to-many column= "EVENT_ID" class="events.Event" />

</set></class>

Page 29: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Dodanie asocjacji skierowanej (3)Dodanie asocjacji skierowanej (3)

oo W efekcie otrzymaliśmy:W efekcie otrzymaliśmy:�� poniższy schemat relacyjny (tabela pośrednicząca została poniższy schemat relacyjny (tabela pośrednicząca została

wygenerowana „automatycznie”)wygenerowana „automatycznie”)wygenerowana „automatycznie”)wygenerowana „automatycznie”)

�� oraz połączenie asocjacją (referencjami języka Java) od oraz połączenie asocjacją (referencjami języka Java) od oraz połączenie asocjacją (referencjami języka Java) od oraz połączenie asocjacją (referencjami języka Java) od klasy klasy PersonPerson do do EventEvent (ale nie w drugą stronę).(ale nie w drugą stronę).

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 2929

Person Event

Page 30: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Użycie asocjacji skierowanejUżycie asocjacji skierowanej

oo Metoda tworząca nowe powiązanie pomiędzy Metoda tworząca nowe powiązanie pomiędzy Person oraz Person oraz EventEvent

private void addPersonToEvent ( Long personId , Long eventId ) {

�� Powiązanie dodajemy poprzez modyfikację Powiązanie dodajemy poprzez modyfikację pojemnika języka Java,pojemnika języka Java,

private void addPersonToEvent ( Long personId , Long eventId ) {Session session = HibernateUtil. getSessionFactory().getCurrentSession();session.beginTransaction();

Person aPerson = (Person) session.load(Person. class , personId);Event anEvent = (Event) session.load(Event. class , eventId);aPerson.getEvents().add(anEvent);session.getTransaction().commit();

}

pojemnika języka Java,pojemnika języka Java,�� HibernateHibernate to automatycznie wykrywa i w tle to automatycznie wykrywa i w tle

uaktualnia bazę danych,uaktualnia bazę danych,�� Analogiczna „automatyka” istnieje dla atrybutów.Analogiczna „automatyka” istnieje dla atrybutów.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3030

Page 31: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Użycie asocjacji skierowanej (2)Użycie asocjacji skierowanej (2)

oo StworzenieStworzenie�� Zdarzenia,Zdarzenia,

OsobyOsoby�� OsobyOsoby

oo Dodanie Osoby do Zdarzenia.Dodanie Osoby do Zdarzenia.EventManager mgr = new EventManager();

Long eventId = (Long) mgr.createAndStoreEvent( "Zdarzenie 01" , new Date());Long personId = (Long) mgr.createAndStorePerson( "Jan" , "Kowalski" );mgr.addPersonToEvent(personId, eventId);System . out.println("Dodano osobe " + personId + " do zdarzenia " + eventId);

oo Zasadnicza wada podejścia Zasadnicza wada podejścia HibernateHibernate::�� Korzystamy z identyfikatorów, zamiast Korzystamy z identyfikatorów, zamiast

natywnych referencji!natywnych referencji!Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3131

HibernateUtil. getSessionFactory().close();

Page 32: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Dodanie asocjacji dwukierunkowejDodanie asocjacji dwukierunkowej

oo Schemat relacyjny nie ulega zmianie.Schemat relacyjny nie ulega zmianie.oo Dodajemy pojemnik z osobami uczestniczącymi w zdarzeniu do klasy Dodajemy pojemnik z osobami uczestniczącymi w zdarzeniu do klasy

EventEvent..public class Event {

oo Uzupełniamy plik mapujący Uzupełniamy plik mapujący Event.hbm.xmlEvent.hbm.xml ..

public class Event {// [...]private Set participants = new HashSet();public Set getParticipants() {

return participants ;}public void setParticipants(Set participants) {

this . participants = participants;}

}

oo Uzupełniamy plik mapujący Uzupełniamy plik mapujący Event.hbm.xmlEvent.hbm.xml ..

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3232

<hibernate-mapping><class name= "events.Event" table="EVENTS" >

[...]<set name= "participants" table="PERSON_EVENT" inverse="true" >

<key column= "EVENT_ID" /><many-to-many column= "PERSON_ID" class="events.Person" />

</set> </class>

</hibernate-mapping>

Page 33: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Dodanie asocjacji dwukierunkowej (2)Dodanie asocjacji dwukierunkowej (2)

oo Tag Tag setset�� Użycie prawie takie samo jak w przypadku asocjacji Użycie prawie takie samo jak w przypadku asocjacji

skierowanej,skierowanej,skierowanej,skierowanej,�� Nazwy kolumn Nazwy kolumn keykey oraz oraz manymany--toto--manymany, dla dwóch , dla dwóch

plików mapujących, są zamienione.plików mapujących, są zamienione.�� Atrybut Atrybut inverse="trueinverse="true””

oo Dodajemy odpowiednie metody do klasy PersonDodajemy odpowiednie metody do klasy Personpublic class Person {

// [...]

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3333

// [...]public void addToEvent(Event event) {

this .getEvents().add(event);event.getParticipants().add( this );

}public void removeFromEvent(Event event) {

this .getEvents().remove(event);event.getParticipants().remove( this );

}}

Page 34: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Dodanie asocjacji dwukierunkowej (3)Dodanie asocjacji dwukierunkowej (3)

oo Podsumowując: w celu zamiany asocjacji Podsumowując: w celu zamiany asocjacji skierowanej na dwukierunkową należy:skierowanej na dwukierunkową należy:

Oznaczyć jedną ze stron jako Oznaczyć jedną ze stron jako inverseinverse ,,�� Oznaczyć jedną ze stron jako Oznaczyć jedną ze stron jako inverseinverse ,,

�� Dla liczności „1 Dla liczności „1 -- *” musi to być strona „*”,*” musi to być strona „*”,�� Dla liczności „* Dla liczności „* -- *” można wybrać dowolną *” można wybrać dowolną

stronę.stronę.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3434

Page 35: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Atrybuty powtarzalneAtrybuty powtarzalne

oo W W HibernateHibernate nazywane są kolekcją wartości nazywane są kolekcją wartości ((CollectionCollection of of valuesvalues).).Różnica w stosunku do asocjacji polega na Różnica w stosunku do asocjacji polega na oo Różnica w stosunku do asocjacji polega na Różnica w stosunku do asocjacji polega na tym, że wartości nie są współdzielone (a tym, że wartości nie są współdzielone (a obiekty oczywiście tak).obiekty oczywiście tak).

oo Dla klasy Osoba (Dla klasy Osoba (PersonPerson) dodamy listę ) dodamy listę adresów eadresów e--mail.mail.adresów eadresów e--mail.mail.

oo Specjalny Specjalny tagtag elementelement

�� Oznacza, że kolekcja nie zawiera odniesień do Oznacza, że kolekcja nie zawiera odniesień do innych wystąpień, ale listę elementów typu innych wystąpień, ale listę elementów typu StringString..

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3535

Page 36: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Atrybuty powtarzalne (2)Atrybuty powtarzalne (2)

oo Dodajemy pojemnik z adresami eDodajemy pojemnik z adresami e--mail do klasy mail do klasy PersonPerson ..

public class Person {// [...]// [...]

private Set emailAddresses = new HashSet();

public Set getEmailAddresses() {return emailAddresses ;

}

public void setEmailAddresses(Set emailAddresses) {this . emailAddresses = emailAddresses;

} }

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3636

Page 37: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Atrybuty powtarzalne (3)Atrybuty powtarzalne (3)

oo Uzupełniamy plik mapujący Uzupełniamy plik mapujący Event.hbm.xmlEvent.hbm.xml ..<hibernate-mapping>

<class name= "events.Event" table="EVENTS" >[...]<set name= "emailAddresses" table="PERSON_EMAIL_ADDR" >

oo Uaktualniony schemat relacyjnyUaktualniony schemat relacyjny

<set name= "emailAddresses" table="PERSON_EMAIL_ADDR" ><key column= "PERSON_ID"/><element type= "string" column="EMAIL_ADDR" />

</set> </class>

</hibernate-mapping>

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3737

Page 38: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Zapytania w Zapytania w HibernateHibernate

oo Przykładowe zapytania w Przykładowe zapytania w HibernateHibernate QueryQueryLanguageLanguage (HQL)(HQL)

List cats = session.createQuery(List cats = session.createQuery("from Cat as cat where cat.birthdate < ?").setDate(0, date).list();

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)

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3838

.setEntity(0, pk)

.list();

Cat mother = (Cat) session.createQuery("select cat.mother from Cat as cat where cat = ?").setEntity(0, izi).uniqueResult();]]

Query mothersWithKittens = (Cat) session.createQuery("select mother from Cat as mother left join fetch mother.kittens");

Set uniqueMothers = new HashSet(mothersWithKittens.list());

Page 39: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Zapytania w Zapytania w HibernateHibernate (2)(2)

oo Przetwarzanie wyników zapytańPrzetwarzanie wyników zapytańIterator iter = sess.createQuery("from eg.Qux q order by q.likeliness").iterate();

while ( iter.hasNext() ) {while ( iter.hasNext() ) {Qux qux = (Qux) iter.next(); // pobierz obiekt

// Metoda, ktorej nie mozna bylo zawrzec w zapytaniuif ( qux.calculateComplicatedAlgorithm() ) {

// Usun aktualna instancjeiter.remove();

// Koniecbreak;

}}

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 3939

Page 40: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

PodsumowaniePodsumowanie

oo Niezgodność impedancji czyli trudności w Niezgodność impedancji czyli trudności w pogodzeniu świata relacyjnego oraz pogodzeniu świata relacyjnego oraz obiektowego, jest bardzo poważnym, obiektowego, jest bardzo poważnym, obiektowego, jest bardzo poważnym, obiektowego, jest bardzo poważnym, praktycznym problemem.praktycznym problemem.

oo Można wyróżnić dwa generalne podejścia do Można wyróżnić dwa generalne podejścia do jego rozwiązania:jego rozwiązania:�� Modyfikacje języka programowania, tak aby Modyfikacje języka programowania, tak aby �� Modyfikacje języka programowania, tak aby Modyfikacje języka programowania, tak aby

posiadał jak najwięcej zalet baz danych,posiadał jak najwięcej zalet baz danych,�� Stworzenie dodatkowych bibliotek ułatwiających Stworzenie dodatkowych bibliotek ułatwiających

pracę z danymi.pracę z danymi.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 4040

Page 41: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Podsumowanie (2)Podsumowanie (2)

oo Przykładem pierwszego podejścia do Przykładem pierwszego podejścia do problemu jest Microsoft C# 3.0 razem z LINQ.problemu jest Microsoft C# 3.0 razem z LINQ.

Język zapytań (funkcjonalnie podobny do SQL) Język zapytań (funkcjonalnie podobny do SQL) �� Język zapytań (funkcjonalnie podobny do SQL) Język zapytań (funkcjonalnie podobny do SQL) stał się częścią języka programowania.stał się częścią języka programowania.

�� Niezgodność impedancji znika całkowicie, czyli Niezgodność impedancji znika całkowicie, czyli nie musimy mapować konstrukcji obiektowych na nie musimy mapować konstrukcji obiektowych na relacyjne i odwrotnie.relacyjne i odwrotnie.Dzięki temu mamy m. in. kontrolę typologiczną.Dzięki temu mamy m. in. kontrolę typologiczną.�� Dzięki temu mamy m. in. kontrolę typologiczną.Dzięki temu mamy m. in. kontrolę typologiczną.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 4141

Page 42: MSI – dr. In ż. Mariusz Trzaskausers.pja.edu.pl/~mtrzaska/Files/MSI/MSI-13.pdf · modelu relacyjnego ze składu danych ... System.out.println ("Name : ... przełomu spowodowanego

Podsumowanie (2)Podsumowanie (2)

oo Drugie podejście jest reprezentowane przez Drugie podejście jest reprezentowane przez HibernateHibernate

Biblioteka rzeczywiście ułatwia pracę z bazami Biblioteka rzeczywiście ułatwia pracę z bazami �� Biblioteka rzeczywiście ułatwia pracę z bazami Biblioteka rzeczywiście ułatwia pracę z bazami danych,danych,

�� Niestety zamiast natywnych referencji Niestety zamiast natywnych referencji wykorzystuje identyfikatory.wykorzystuje identyfikatory.

oo Wydaje się, że zdecydowanie lepszym Wydaje się, że zdecydowanie lepszym oo Wydaje się, że zdecydowanie lepszym Wydaje się, że zdecydowanie lepszym podejściem jest dodanie cech baz danych do podejściem jest dodanie cech baz danych do języka programowania, tak jak w Microsoft języka programowania, tak jak w Microsoft LINQ.LINQ.

Modelowanie Systemów Informacyjnych (MSI), wykład 1 3Modelowanie Systemów Informacyjnych (MSI), wykład 1 3 4242