Interfejsy obiektowo
Transkrypt
Interfejsy obiektowo
Odwzorowanie obiektoworelacyjne Wykład opracowali: Marek Wojciechowski i Tomasz Koszlajda Plan wykładu ` ` ` ` Techniki odwzorowania O/R JDBC Hibernate Java Persistence 1 Odwzorowanie obiektowo-relacyjne ` Odwzorowanie obiektowej architektury systemu informatycznego w relacyjne struktury danych bazy danych Aplikacja obiektowa Wielokąt #typFigury string #liczbaWierzch integer +Powierzchnia() : Float +Przesuń(Float, Float) +DodajWierzch(Punkt) Logiczny model danych – logika biznesowa Middleware select * from Wielokąty iinsertt into i t wielokąty i l k t values (w.typFigury, …) Odwzorowanie O/R Relacyjna baza danych Wielokąty idWielokąta number(9) PK typFigury varchar(15) LiczbaWierzch number(3) wBazieDanych B i D hb boolean l Fizyczny model danych Techniki O/RM ` ` ` ` ` ` Dodanie do schematów relacji atrybutów implementacyjnych U Utrzymywanie i meta-danych d h opisujących i j h reguły ł odwzorowania R/M Odwzorowanie sieci dziedziczenia klas Odwzorowanie związków między klasami Odwzorowanie atrybutów klas S j i wydajności Strojenie d j ś i odwzorowania d i 2 Atrybuty implementacyjne Oprócz odwzorowania atrybutów informacyjnych w O/RM niezbędne jest używanie dodatkowych atrybutów implementacyjnych ` Punkt Wielokąt #X : Float #typFigury string #Y : Float jjestWierzchołkiem tWi h łki #liczbaWierzchołków integer +Powierzchnia() : Float [1] +Kąt() : Float [3..*] +Odległość() : Float +Przesuń(Float, Float) +Przesuń(Float, Float) +DodajWierzchołek(Punkt) [2] tworzKrawędźZ [2] Wielokąty idWielokąta number(9) PK typFigury varchar(15) LiczbaWierzchołków number(3) wBazieDanych boolean ` ` Klucze podstawowe i obce Zapewnienie trwałości danych Punkty idPunktu number(10) PK idWielokąta number(9) FK X number(5,2) Y number(5,2) wBazieDanych boolean ` Znaczniki czasowe Utrzymywanie meta-danych Schemat bazy danych należy rozszerzyć o informacje dotyczące logiki odwzorowania O/R: y y relacjij • Zmienne obiektów → atrybuty • Związki → atrybuty, tabele • Atrybuty wielowartościowe obiektów → tabele • Konwersja typów danych • Źródło danych • … klasa typ tabela kolumna Pracownik Nazwisko zmienna string Pracownicy Nazwisko varchar Pracownik Szef Pracownik Pracownicy Pracownik JęzykiObce set(string) Id_szefa Języki_obce Nazwa typ number String … 3 Odwzorowanie sieci dziedziczenia Dostępnych jest kilka metod odwzorowania: ` Osoba +imię : String +nazwisko : String +wiek : integer +płeć : Płeć ` {non complete, overlapping} Pracownik +etat: String +płaca: float +firma: Sring Student ` +Uczelnia: String +Kierunek: String +rokStudiów: integer ` Odwzorowanie hierarchii klas w pojedynczą tablicę Odwzorowanie konkretnych klas w osobne tabele Odwzorowanie każdej kl klasy w osobną b tabelę t b l Odwzorowanie klas w uniwersalną strukturę tabel Odwzorowanie hierarchii klas w pojedynczą tabelę Osoby Imię Nazwisko Płeć Etat Płaca Firma Uczelnia Kierunek RokStudiów j S d jestStudentem jestPracownikiem Własności: • W tabeli będzie przechowywanych dużo zwartości pustych • Tablica T bli może ż osiągać i ć duży d ż rozmiar i • Łatwość przetwarzania polimorficznego • Duża wydajność dla przetwarzania heterogenicznego • Mała wydajność dla przetwarzania homogenicznego • Mała wydajność dla modyfikacji struktury pojedynczych p j y y klas • Trudne utrzymywanie przynależności do typów Dobre dla prostych i płaskich hierarchii klas 4 Odwzorowanie konkretnych klas w osobne tabele • Jeżeli klasa Osoba jest klasą abstrakcyjną • Zależność między ę y podzbiorami p danych typu complete Własności: Pracownicy idPracownika Imię Nazwisko Płeć Etat Płaca Firma • • Studenci idStudenta Imię Nazwisko Płeć Uczelnia Kierunek RokStudiów • • Trudna implementacja overlapping - konieczność implementacji wspólnej dziedziny dla kluczy relacji Mała wydajność dla przetwarzania polimorficznego Duża wydajność dla przetwarzania homogenicznego Modyfikacja klasy z podklasami wymaga modyfikacji schematów wielu tabel Dobre dla rozłącznych podzbiorów rozszerzeń klas Odwzorowanie każdej klasy w osobną tabelę Osoby idOsoby Imię ę Nazwisko Płeć Pracownicy idOsoby FK Etat Płaca Firma Studenci idOsoby FK Uczelnia Kierunek RokStudiów Własności: • • • • • • Proste odwzorowanie 1:1 Łatwość p przetwarzania polimorficznego Łatwe utrzymywanie dla modyfikacji nadklas i dodawania podklas Rozmiar struktur proporcjonalny do liczby danych D Duża li b tablic liczba bli Mała wydajność przetwarzania homogenicznego Dobre dla pokrywających się podzbiorów rozszerzeń klas i często zmieniających się klas 5 Odwzorowanie klas w uniwersalną strukturę tabel Własności: ` Łatwość utrzymania dla zmian schematu ` Trudne i mało wydajne przetwarzanie Dobre dla złożonych aplikacji przetwarzających niezbyt duże zbiory danych Odwzorowanie cech klas ` Osoby +i i : String +imię St i +nazwisko : String +płeć : Płeć +liczbaOsób : Integer Możliwe strategie: ` ` ` ` Jednokolumnowa i jednowierszowa tabela dla każdej cechy Wielokolumnowe i jednowierszowe tabele dla każdej z klas Wielokolumnowa i jednowierszowa tabela wspólna dla wszystkich klas Wielowierszowa tabela o generycznym schemacie wspólna dla wszystkich klas 6 Strojenie wydajności ` ` Strojenie mapowania struktur obiektowych na yj wybór y strategii g odwzorowania hierarchii relacyjne: dziedziczenia, związków i cech klas Opóźnione czytanie: dla dużych obiektów żądanie dostępu do obiektu może być realizowane jako odczyt jedynie podzbioru danych składających się na obiekt. Pozostałe części obiektu będą doczytane w momencie wystąpienia żądania dostępu do nich Oferta OR/M ` Lista produktów O/RM • ObjectRelationalBridge (OJB) - projekt open source wspierający API ODMG and JDO • TopLink - O/RM dla języka Java na serwery WWW • EnterpriseObjectFramework (EOF) - framework używany w WebObjects na Apple • JdoGenie - wydajna implementacja JDO • ClassDbi - O/RM dla języka Perl • HiberNate - projekt open source dla Javy • ActiveRecord – framework dla języka • SQLObject – framework dla języka Python • EZPDO – framework dla PHP5 • Picasso - framework na platformę .NET • Gentle.NET - framework dla .NET pisany w C# • Genome - O/RM dla platformy .NET and systemów SQL Server/Oracle • AtomsFramework - framework dla VB6 and .NET 7 JDBC - Java Database Connectivity Dostęp z poziomu języka Java do relacyjnej bazy danych Umożliwia ręczne wyłuskiwanie wartości danych Dostęp do bazy danych wymaga: • Załadowania sterownika systemu bazy danych, którego wynikiem będzie dostęp do systemowego obiektu: DriverManager • Zainicjowania połączenia z bazą danych za pomocą metody getConnection tC ti Connection mp = DriverManager.getConnection ( <URL>, <login>, <hasło> ); Dostęp do danych Dostęp do danych jest wykonywany za pomocą klasy: ResultSet Statement zapyt = mp.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet wynik = zapyt.executeQuery( "SELECT etat FROM Pracownicy"); // wynik ik nie i b będzie d i pokazywał k ł zmian i wprowadzanych d h // przez innych i będzie modyfikowalny 8 Operacje za pomocą kursora Dostęp do konkretnych krotek wyniku wymaga zastosowania kursora: int x = 65041203789; String e = "Prezes"; while (wynik.next( )) { int Pesel = wynik.getInt(1); if (Pesel = x) { String etat = wynik.updateString(2,e); } } Dostęp do danych polega na przenoszeniu wartości między systemem danych bazy danych a systemem danych języka programowania Technologie O/RM ` ` O/RM = Object-Relational Mapping = odwzorowanie obiektowo-relacyjne Obejmują: ` ` ` ` API do zarządzania trwałością obiektów mechanizm specyfikowania metadanych opisujących odwzorowanie klas na relacje w bazach danych język lub API do wykonywania zapytań Popularne p implementacje p j O/RM: ` ` ` Hibernate Oracle Toplink JDO 9 Hibernate ` ` ` ` ` ` ` Najpopularniejsza implementacja odwzorowania obiektowo-relacyjnego dla języka Java Obsługa asocjacji asocjacji, kompozycji kompozycji, dziedziczenia dziedziczenia, polimorfizmu, kolekcji Wysoka wydajność i skalowalność Wiele sposobów zadawania zapytań Wykorzystuje siłę technologii relacyjnych baz danych Professional Open Source (JBoss Inc.) Obecnie jedna z implementacji standardu Java Persistence Architektura Hibernate Aplikacja Trwałe obiekty Hibernate Plik konfiguracyjny Definicje odwzorowania O/R Baza danych 10 Konfiguracja Hibernate hibernate.cfg.xml 1 2 3 4 5 6 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate hibernate-configuration config ration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.datasource"> jdbc/sample</property> <property t name="dialect"> "di l t" org.hibernate.dialect.OracleDialect</property> <mapping resource="myhib/Dept.hbm.xml"/> </session-factory> </hibernate-configuration> Specyfikacja klas trwałych obiektów Klasy encyjne występujące w logicznym modelu danych aplikacji Definiowane w formie Plain Old Java Object (POJO) Najlepiej posiadające sztuczny identyfikator ` ` ` public class Dept { private Long id; private String dname; Dept.java public void setId(Long id) { this.id = id; } public Long getId() { return id; } public void setDname(String dname) { this.dname = dname; } public String getDname() { return dname; } } 11 Odwzorowanie O/R w Hibernate ` Definiowane w pliku lub plikach XML ` ` ` ` ` typowo odrębny plik dla każdej klasy zwyczajowe rozszerzenie .hbm.xml. hbm xml Zorientowane na opis odwzorowania z punktu widzenia klasy Java, a nie tabeli Tworzone ręcznie lub generowane za pomocą narzędzi Pliki odwzorowania wskazywane w pliku konfiguracyjnym hibernate.cfg.xml lub bezpośrednio w aplikacji Przykład odwzorowania O/R Dept.hbm.xml 1 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping ...> > 2 3 4 5 <hibernate-mapping package="myhib"> <class name="Dept" table="DEPT"> 6 DEPT ------------------------DEPTNO NUMBER PRIMARY KEY DNAME VARCHAR2(30) <id name="id" type="long" column="deptno"> <generator class="sequence"> <param name="sequence">dept_seq</param> </generator> </id> <property name="dname" column="dname" type="string" not-null="true” length=30/> </class> </hibernate-mapping> 12 Podstawowe interfejsy Hibernate API ` SessionFactory ` ` ` Session ` ` ` służy do tworzenia obiektów Session obiekt tworzony raz dla całej aplikacji jednostka pracy („unit of work”) obsługuje trwałość obiektów Transaction ` ` transakcja w bazie danych najczęściej jedna w sesji Hibernate w akcji 2 SessionFactory sf = new Configuration() Configuration().configure().buildSessionFactory(); configure() buildSessionFactory(); ... Session s = sf.openSession(); 3 Transaction tx = s.beginTransaction(); 4 Dept d = new Dept(); // ulotny d.setDname("MARKETING"); 5 6 s save(d); s.save(d); 7 s.close(); 1 // trwały tx.commit(); 13 Stany obiektu w Hibernate ` Ulotny (ang. transient) (new(), delete(), …) ` ` Trwały (ang (ang. persistent) (save(), (save() persist(), persist() …)) ` ` ` ` utworzony operatorem new, ale niezwiązany z sesją posiada identyfikator i reprezentację w bazie danych związany z sesją jego stan jest automatycznie synchronizowany z bazą danych Odłączony (ang. detached) (update(), …) ` ` obiekt, który był trwały, ale jego sesja się zakończyła można go modyfikować, a następnie związać z nową sesją Praca z obiektami w Hibernate ` Uczynienie obiektu trwałym: ` ` Odczyt obiektu o znanym identyfikatorze: ` ` metoda delete() obiektu Session Modyfikacja trwałego obiektu ` ` metody load() i get() obiektu Session Usunięcie obiektu: ` ` metoda save() obiektu Session metody setXXX() obiektu S Synchronizacja h i j obiektów bi któ odłączonych dł h ` metody update(), saveOrUpdate() i merge() obiektu Session 14 Praca z obiektami - Przykłady ` Utworzenie i zachowanie obiektu Dept d = new Dept(); d setDname("MARKETING"); d.setDname( MARKETING ); Long genId = (Long) session.save(d); ` Odczyt i modyfikacja obiektu Dept d = (Dept) session.load(Dept.class, new Long(20)); d.setDname("SALES AND MARKETING"); ` Usunięcie obiektu Dept d = (Dept) session.load(Dept.class, new Long(20)); session.delete(d); Zapytania w Hibernate ` Zapytania w języku HQL (Hibernate Query Language) ` ` ` składnia podobna do SQL zorientowany obiektowo zapytania odwołują się do klas, a nie tabel List depts = (List) session.createQuery( "from Dept as dept where dept.dname = 'SALES'") .list(); ` ` ` Zapytania Z t i w natywnym t SQL Zapytania poprzez obiekty Criteria Zapytania poprzez obiekty Query By Example 15 Asocjacje w Hibernate ` ` ` ` 1:1, N:1, 1:N, N:M Z tabelą pośrednią (1:1, N:1, 1:N, N:M) lub bez (1:1 (1:1, N:1 N:1, 1:N) Jednokierunkowe lub dwukierunkowe Możliwość kaskadowej propagacji operacji na obiekty zależne: ` none, all, save-update, delete, all-delete-orphan Przykład asocjacji w Hibernate (1/2) Dept Emp Emp.hbm.xml Emp.java public class Emp { private Long id; private String ename; private Dept dept; ... } <class name="Emp" table="EMP"> ... <many-to-one name="dept" column="deptno" not-null="true"/> </class> 16 Przykład asocjacji w Hibernate (2/2) Dept Emp Dept.java public class Dept { private Long id; private String dname; private Set emps; ... } Dept.hbm.xml <class name="Dept" table="DEPT"> ... <set name="emps" inverse="true" cascade="all"> <key column="deptno"/> <one-to-many class="Emp"/> </set> </class> Java Persistence ` Standard dotyczący zapewniania trwałości obiektów w aplikacjach Java EE i Java SE ` ` ` Geneza standardu Java Persistence ` ` ` opracowany razem z EJB 3 stanowi część Java EE 5 niepowodzenie koncepcji encyjnych EJB sukces technologii O/RM Rola Java Persistence na tle technologii O/RM ` ` oparty o odwzorowanie obiektowo-relacyjne definiuje standardowe API 17 Elementy standardu Java Persistence ` ` ` Interfejs programistyczny Java Persistence API Język zapytań Java Persistence Query Language Metadane o odwzorowaniu obiektowo-relacyjnym Encje ` ` ` ` Encja (ang. entity) to lekki obiekt służący do reprezentacji trwałych danych Typowo reprezentuje tabelę z relacyjnej bazy danych Definiowana w formie klasy encji i ewentualnie klas pomocniczych Wymagania dla klas encji: ` ` ` POJO z adnotacją @Entity bezargumentowy konstruktor (public lub protected) implementacja Serializable, jeśli obiekty będą odłączane 18 Encja - Przykład 1 2 @Entity Blad.java @Table(name="BLEDY") public class Blad implements Serializable { 4 @Id private Long id; private String kod; private String opis; 5 public Blad() { } 3 public Long getId() { return id; } public void setId(Long id) { this this.id id = id; } public String getKod() { return kod; } public void setKod(String kod) { this.kod = kod; } public String getOpis() { return opis; } public void setOpis(String opis) { this.opis = opis; } 6 } Związki między encjami ` Liczność ` ` ` ` ` Kierunkowość ` ` ` 1:1 (@OneToOne) 1:N (@OneToMany) N:1 (@ManyToOne) N:M (@ManyToMany) dwukierunkowe j jednokierunkowe Kaskada operacji: ` PERSIST, MERGE, REMOVE, REFRESH, ALL 19 Związki między encjami - Przykład Wykonawca Album @Entity public class Wykonawca implements Serializable { ... @OneToMany(cascade=CascadeType.ALL, mappedBy="wykonawca") private Collection<Album> albumy; ... } @Entity public class Album implements Serializable { ... @ManyToOne private Wykonawca wykonawca; ... } Zarządca encji (Entity Manager) ` Zarządca encji zarządzany przez kontener (EJB, JSF) ` ` ` @PersistenceContext wstrzykiwany do EntityManager em; komponentu aplikacji kontekst trwałości propagowany między komponentami w ramach transakcji JTA Zarządca encji zarządzany przez aplikację (serwlety,SE) ` ` tworzony i niszczony przez aplikację każdy zarządca encji tworzy odrębny kontekst trwałości @PersistenceUnit EntityManagerFactory emf; EntityManager em = emf.createEntityManager(); 20 Jednostka trwałości (Persistence Unit) ` ` ` ` ` Definiuje zbiór klas encji zarządzanych przez EntityManager w aplikacji Obejmuje klasy encji z jednej bazy danych Definiowana w pliku konfiguracyjnym persistence.xml Posiada nazwę unikalną w zasięgu widzialności W aplikacjach Java EE wykorzystuje źródło danych ` ` ` obsługujące transakcje JTA nieobsługujące transakcji JTA W aplikacjach Java SE zawiera parametry połączenia JDBC Plik persistence.xml - Przykład persistence.xml 1 2 <?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" ...> <persistence-unit name="AlbumyJPPU" transaction-type="JTA"> 3 <provider> oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider </provider> 4 <jta-data-source>jdbc/sample</jta-data-source> 5 <properties> p p <property name="toplink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence> 21 Cykl życia encji ` ` Instancje encji są zarządzane przez instancję EntityManager Stany instancji encji: ` ` ` ` nowa (ang. new) zarządzana (ang. managed) odłączona (ang. detached) usunięta (ang. removed) Utrwalanie instancji encji ` Metoda persist() obiektu EntityManager @PersistenceContext EntityManager em; ... Blad b = new Blad(); b.setKod("b001"); b tO i ("Ni d b.setOpis("Niedozwolona l operacja j w module d l X") X"); em.persist(b); 22 Odczyt, odświeżanie i synchronizacja instancji encji z bazą danych ` ` ` ` ` Odczyt poprzez klucz główny: metoda find() Odświeżenie stanu z bazy danych: metoda refresh() Modyfikacje instancji: metody setXXX() encji Synchronizacja instancji odłączonej: metoda merge() Moment zapisu danych do bazy danych: ` ` ` automatycznie: gdy transakcja jest zatwierdzana jawnie: w wyniku wywołania metody flush() Strategia blokowania danych ` ` domyślnie blokowanie optymistyczne możliwość jawnego blokowania metodą lock() Usuwanie instancji encji ` Metoda remove() obiektu EntityManager @PersistenceContext EntityManager em; ... Blad b = em.find(Blad.class, new Long(13)); em.remove(b); 23 Transakcje ` EntityManager zarządzany przez kontener (EJB) ` ` kontener zarządza transakcjami E tit M EntityManager zarządzany d przez aplikację lik j ` transakcja JTA (serwlety) @Resource UserTransaction utx; utx.begin(); ... utx.commit(); // utx.rollback(); ` transakcja na poziomie zasobu (Java SE, serwlety) EntityManager em; em.getTransaction().begin(); ... em.getTransaction().commit(); // em.getTransaction().rollback(); Zapytania do bazy danych ` Rodzaje zapytań (metody obiektu EntityManager) ` ` ` ` Parametryzacja zapytań ` ` ` dynamiczne w JPQL - createQuery() dynamiczne natywne - createNativeQuery() nazwane (JPQL lub natywne) - createNamedQuery() nazwane (np. :kodBledu) pozycyjne (np. ?1) Wykonanie zapytania (metody obiektu Query) ` ` getResultList(), getSingleResult() executeUpdate() 24 Zapytanie dynamiczne - Przykład EntityManager em; ... List<Blad> wyn = null; Query q = em.createQuery( "SELECT b FROM Blad b WHERE b.opis LIKE '%problem%'"); wyn = q.getResultList(); Zapytanie nazwane - Przykład Blad.java @Entity @NamedQuery(name = "findByKeyword", query = "SELECT b FROM Blad b WHERE b.opis LIKE :keyword") public class Blad implements Serializable { ... } EntityManager em; ... List<Blad> wyn = null; wyn = em.createNamedQuery("findByKeyword") .setParameter("keyword", "%krytyczny%") .getResultList(); 25 Java Persistence Query Language (JPQL) ` ` ` Umożliwia formułowanie przenaszalnych zapytań, niezależnych od specyfiki poszczególnych systemów Zapytania operują na abstrakcyjnym schemacie obejmującym encje i związki między nimi Składnia podobna do SQL: ` ` ` zapytania SELECT-FROM-WHERE-GROUP BY-HAVINGORDER BY polecenia UPDATE i DELETE dla masowych operacji modyfikacji y j i usuwania: UPDATE-SET-WHERE, DELETEFROM-WHERE Wyrażenia ścieżkowe do nawigacji do związanych encji JPQL - Przykłady ` Nawigacja do kolekcji powiązanych instancji encji SELECT DISTINCT w FROM Wykonawca w, IN(w.albumy) a SELECT DISTINCT w FROM Wykonawca w JOIN w.albumy a ` Wyrażenie ścieżkowe SELECT a FROM Album a WHERE a.wykonawca.nazwa = ‘Mandaryna’ 26 Podsumowanie ` ` ` ` Dostęp do baz danych w aplikacjach języka Java operujących na złożonym obiektowym modelu biznesowym y realizowanyy jest j w oparciu p o technologie odwzorowania obiektowo-relacyjnego (O/RM) Powstało kilka technologii O/RM, z których największą popularność zyskał Hibernate Java Persistence to standard oparty o odwzorowanie obiektowo-relacyjne, yj , definiujący ją y standardowe API Java Persistence jest wynikiem prac nad EJB 3.0, ale może być i zakłada się że będzie wykorzystywany również bez połączenia z EJB Materiały dodatkowe ` ` Hibernate, http://www.hibernate.org/ The Java EE 5 Tutorial, http://java sun com/javaee/5/docs/tutorial/doc/ http://java.sun.com/javaee/5/docs/tutorial/doc/ 27