Technologie odwzorowania obiektowo-relacyjnego: JDO

Podobne dokumenty
Metody dostępu do danych

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Podstawowe wykorzystanie Hibernate

Technologie odwzorowania. owania obiektowo-relacyjnego. relacyjnego: Oracle TopLink

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Metody dostępu do danych

Metody dostępu do danych

Mapowanie obiektowo-relacyjne z wykorzystaniem Hibernate

1 Wprowadzenie do J2EE

Obsługa transakcji rozproszonych Java. Marek Wojciechowski, Maciej Zakrzewicz Instytut Informatyki, Politechnika Poznańska

Wersjonowanie baz danych podczas developmentu. Liquibase. Piotr Pelczar.

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Programowanie obiektowe

Automatyczne generowanie kodu. 4Developers, 26 marca 2010

Bazy danych. Dr inż. Paweł Kasprowski

Kurs programowania aplikacji bazodanowych

Gdzie jest moja tabela?

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Hibernate mapowanie baz danych

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

akademia androida Składowanie danych część VI

Podejście obiektowe do relacyjnych baz danych Hibernate.

Encyjne komponenty EJB

Wywoływanie metod zdalnych

Analiza porównawcza technologii odwzorowania obiektowo-relacyjnego dla aplikacji Java

Strumieniowe bazy danych. Piotr i Paweł

Programowanie wielowarstwowe i komponentowe

Generowanie raportów

Monika Kruk Mariusz Grabowski. Informatyka Stosowana WFiIS, AGH 13 grudzień 2006

Java Persistence API - zagadnienia zaawansowane

Programowanie obiektowe

Wykład 8. SQL praca z tabelami 5

Projektowanie aplikacji z bazami danych

Bazy danych - wykład wstępny

Zasady transformacji modelu DOZ do projektu tabel bazy danych

Hibernate. Adrian Gawor, Adam Klekotka, Piotr Kubisz. Technologie Biznesu Elektronicznego. 12 maja 2009

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

WPROWADZENIE DO BAZ DANYCH

Programowanie w Ruby

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Wywoływanie metod zdalnych

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Oracle PL/SQL. Paweł Rajba.

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

Oracle PL/SQL. Paweł Rajba.

Transakcje. (c) Instytut Informatyki Politechniki Poznańskiej

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

Bazy danych 9. SQL Klucze obce Transakcje

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Krzysztof Kadowski. PL-E3579, PL-EA0312,

Podstawy programowania III WYKŁAD 2

Projektowanie obiektowe oprogramowania Wykład 9 Wzorce architektury aplikacji (1) Wiktor Zychla 2013

Dane wejściowe. Oracle Designer Generowanie bazy danych. Wynik. Przebieg procesu

Bazy danych. Plan wykładu. Rozproszona baza danych. Fragmetaryzacja. Cechy bazy rozproszonej. Replikacje (zalety) Wykład 15: Rozproszone bazy danych

Podstawowe informacje o technologii Java Persistence API - przykład

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Paweł Kurzawa, Delfina Kongo

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wykład 2. Relacyjny model danych

WPROWADZENIE DO BAZ DANYCH

NHibernate Hibernate dla platformy.net. Hibernate posiada także dużą społeczność, zatem nietrudno uzyskać jakieś wsparcie w przypadku problemów.

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

Oracle 12c: Nowości w SQL i PL/SQL

Ustawienie na poziomie sesji (działa do zmiany lub zakończenia sesji zamknięcia połączenia).

Protokół JDBC współpraca z relacyjnymi bazami danych lab3

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

EJB 2.x oraz zmiany w standardzie dla EJB 3.0. Michał Stanek

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

ZAPOZNANIE SIĘ ZE SPOSOBEM PRZECHOWYWANIA

Programowanie w Ruby

Wprowadzenie. Rozdział 23 PDO. Podstawowe kroki aplikacji. Źródło danych

Wprowadzenie. Narzędzia i środowiska programistyczne. Laboratorium 1. Prowadzący: Kierunek: Semestr: Rok: Tomasz Gądek Informatyka Zimowy 2

Obiektowe bazy danych

Wdrożenie do projektu

Hurtownie danych - przegląd technologii

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi

JAVA I BAZY DANYCH. MATERIAŁY:

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Tworzenie komponentów logiki biznesowej i warstwy dostępu do danych w oparciu o EJB3.0/JPA lub EJB 3.1/JPA2

Aplikacje w środowisku Java

Database Connectivity

Wielojęzykowość w aplikacjach J2EE. Tomasz.Skutnik@e-point.pl

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

Podstawowe pojęcia dotyczące relacyjnych baz danych. mgr inż. Krzysztof Szałajko

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Technologia informacyjna

Wybór EUROPEAN będzie rozpoznawał dzień przed miesiącem, natomiast US miesiąc przed dniem.

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

Transkrypt:

68 Technologie odwzorowania obiektowo-relacyjnego: JDO

Plan prezentacji 69 Wprowadzenie do JDO Trwałość obiektów Odwzorowanie obiektowo-relacyjne Transakcje i zapytania

Wprowadzenie do JDO 70

Wprowadzenie 71 JDO (Java Data Objects) to specyfikacja interfejsu do utrwalania obiektów Java (POJO - Plain Old Java Objects) w składnicy danych, którą może być: relacyjny system zarządzania bazą danych, obiektowy system zarządzania bazą danych, pliki tekstowe, pliki XML. JDO zostało stworzone przez firmę Sun, wersja 1.0 pojawiła się w 2002 roku, wersja 2.0 w 2005, standard rozwijany pod auspicjami Java Community Process jako JSR-12. http://java.sun.com/products/jdo/ http://www.jcp.org/en/jsr/detail?id=12 http://www.jdocentral.com/

Kluczowe aspekty JDO 72 Podział klas: zdolne do trwałości (persistence capable): każda klasa której obiekty mają być utrwalane w składnicy danych musi być uprzednio ulepszona (enhanced) na podstawie metadanych, świadome trwałości (persistence aware): klasy jawnie manipulujące składowymi obiektów zdolnych do trwałości, automatycznie ulepszane, zwyczajne: nie wymagają metadanych i nie są ulepszane. Kontrola trwałości obiektów i zmiany w cyklu życia obiektów Wydawanie zapytań do składnicy danych Zarządzanie transakcjami

JDO i inne techniki odwzorowania O/R cecha JDBC O/R EJB 2 JDO 73 standardowy i przenaszalny nie wybór składnic danych nie obsługa POJO nie automatyczna implementacja trwałości nie nie do wykorzystania w aplikacji typu stand-alone nie do wykorzystania w aplikacji J2EE możliwe testowanie jednostkowe nie dynamiczne zapytania * nie generacja kluczy podstawowych * nie* wsparcie obiektów dziedziczonych * nie* automatyczna generacja schematu nie nie* możliwość wykorzystania istniejącego schematu

Implementacje 74 Aktualnie jest dostępnych co najmniej kilkanaście niezależnych implementacji JDO komercyjne: JDO Genie, JPower Map, JCredo, ObjectDB, XCalia, JORM open-source: JDOInstruments, JDOMax, Speedo, Jakarta OJB, JPOX JPOX (www.jpox.org) w wersjach 1.0 i 1.1 to rozprowadzana na licencji Apache 2 implementacja standardów JDO1 i JDO2 darmowa implementacja open-source, wsparcie większości relacyjnych systemów zarządzania bazami danych (MySQL, Oracle, Sybase, HSQL, PostgreSQL, DB2, Firebird, SAPDB/MaxDB, Informix), umożliwia szerokie wykorzystanie mechanizmu wtyczek, dobrze udokumentowane i wsparte dużą liczbą programistów.

Trwałość obiektów 75

Interfejs PersistenceManagerFactory 76 PersistenceManagerFactory: podstawowy obiekt służący do uzyskiwania dostępu do zarządcy trwałości inicjalizacja na poziomie aplikacji inicjalizacja za pomocą parametrów w pliku własności jdo.properties... javax.jdo.persistencemanagerfactoryclass = org.jpox.persistencemanagerfactoryimpl javax.jdo.option.connectiondrivername = oracle.jdbc.oracledriver javax.jdo.option.connectionurl = jdbc:oracle:thin:@miner.cs.put.poznan.pl:1521:miner10g javax.jdo.option.connectionusername = username javax.jdo.option.connectionpassword = password File f = new File("jdo.properties"); PersistenceManagerFactory pmf = new JDOHelper.getPersistenceManagerFactory(f);

Interfejs PersistenceManager 77 PersistenceManager: podstawowy obiekt służący do utrwalania obiektów, odczytywania trwałych obiektów ze składnicy danych, usuwania obiektów ze składnicy danych... PersistenceManagerFactory pmf = new JDOHelper.getPersistenceManagerFactory(f); PersistenceManager pm = pmf.getpersistencemanager(); A P P L II C A T II O N makepersistent maketransient deletepersistent newquery execute PersistenceManagerFactory PersistenceManager Query store manager data store

commit Stany obiektu 78 rollback, commit transient rollback makepersistent persistent new new deleted deleted persistent deleted deleted deletepersistent rollback deletepersistent deletepersistent persistent new new commit hollow hollow commit, rollback change field deletepersistent persistent dirty dirty read persistent fields commit, rollback refresh maketransient persistent clean clean change field

Trwałość obiektów 79 Utrwalenie obiektu Employee e = new Employee(...); pm.makepersistent(e); Usunięcie obiektu Employee e = pm.getobjectbyid(id); pm.deletepersistent(e); Odłączenie obiektu Employee ee = pm.detachcopy(e); Dołączenie obiektu Employee eee = pm.makepersistent(ee);

Ulepszanie klas 80 Ulepszanie klasy polega na dodaniu do skompilowanego bajtkodu dodatkowych pól i metod wg poniższego schematu: Klasa + pole1 + pole2 Klasa + pole1 + pole2 + jdofieldtypes + jdofieldnames + jdodetachedstate + jdoprovidefield() + jdoreplacefield() + jdocopyfield() + jdosetpole1() + jdogetpole1()...

Ulepszanie klas 81 Ręczne ulepszenie klas java -cp classpath org.jpox.enhancer.jpoxenhancer [options] [jdo-files] where options can be -d target-dir-name : Write the enhanced classes to the specified dir -checkonly : Just check the classes for enhancement status -verify : Verify the classes -v : verbose output c:\> java -cp target\classes;lib\jpox-enhancer.jar;lib\jpox.jar;lib\jdo.jar; lib\log4j.jar;lib\bcel.jar -Dlog4j.configuration=file:log4j.properties org.jpox.enhancer.jpoxenhancer -v target/classes/pl/org/ploug/szkola2006/jdo/package.jdo Automatyczne ulepszanie klas (!) Maven Ant

Możliwości projektowania Istnieją trzy możliwości projektowania aplikacji wykorzystującej JDO: forward mapping: dla istniejącego modelu klas projektowany jest schemat składnicy danych, reverse mapping: dla istniejącego schematu składnicy danych projektowany jest model klas, meet-in-the-middle mapping: istniejący model klas jest dopasowywany do istniejącego schematu składnicy danych. Lokalizacja metadanych pl.org.ploug.szkola2006 META-INF/package.jdo META-INF/package.jdo WEB-INF/package.jdo WEB-INF/package.jdo package.jdo package.jdo pl/package.jdo pl/package.jdo pl/org/package.jdo pl/org/package.jdo pl/org/ploug/package.jdo pl/org/ploug/package.jdo pl/org/ploug/szkola2006.jdo pl/org/ploug/szkola2006.jdo pl.jdo pl.jdo pl/org.jdo pl/org.jdo pl/org/ploug.jdo pl/org/ploug.jdo 82

Tryby pracy 83 tożsamość zarządzana przez składnicę nowy schemat JDO generuje potrzebne tabele i dodaje atrybut klucza podstawowego oraz generuje identyfikatory obiektów istniejący schemat metadane definiują odwzorowanie tabel i atrybutów, projektant generuje identyfikatory obiektów tożsamość zarządzana przez aplikację JDO generuje potrzebne tabele, projektant generuje identyfikatory obiektów JDO odwzorowuje klasy na istniejące tabele, projektant generuje identyfikatory obiektów

Przykład metadanych 84 package pl.org.ploug; public class Employee { String ename = null; String job = null;... } package.jdo <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE jdo PUBLIC "-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 2.0//EN" "http://java.sun.com/dtd/jdo_2_0.dtd"> <jdo> <package name="pl.org.ploug"> <class name="employee" identity-type="datastore"> <field name="ename"/> <field name="job"/> </class> </package> </jdo>

Tożsamość zarządzana przez składnicę 85 W sytuacji gdy tożsamością obiektów zarządza składnica danych, obiekty trwałych klas nie posiadają jawnej składowej zawierającej identyfikator. Identyfikator jest przechowywany tylko po stronie składnicy danych. Możliwości generowania identyfikatorów: natywny, inkrementalny, automatycznie przydzielany, pobierany z sekwencera, UUID / hex UUID, maksymalny. package.jdo <class name="employee" identity-type="datastore"> <datastore-identity strategy="sequence" sequence="nazwa sekwencji"/>... </class>

Tożsamość zarządzana przez aplikację 86 W przypadku zarządzania tożsamością przez aplikację konieczne jest zdefiniowanie klasy klucza podstawowego. Wartość klucza podstawowego jest przechowywana w składowej danej klasy. Klasa prostego klucza podstawowego jest wbudowana. Możliwości generowania identyfikatorów jak poprzednio. <class name="employee" identity-type="application"> <field name="empno" primary-key="true"> <column name="empno"/> </field>... </class> package.jdo

Tożsamość nietrwała 87 Nadanie klasie tożsamości nietrwałej (nondurable identity) powoduje brak jednoznacznego identyfikatora w składnicy danych. Mechanizm stosuje się dla danych, dla których nigdy nie zachodzi dostęp na podstawie wartości klucza podstawowego (np. pozycje w pliku dziennika). <class name="logger" identity-type="nondurable">... </class> package.jdo

Odwzorowanie obiektowo-relacyjne 88

Odwzorowanie O/R 89 Odwzorowanie pojedynczej klasy na pojedynczą tabelę package pl.org.ploug.szkola2006.jdo; Department -deptno: int - name: String - location: Spring public class Department { private int deptno; private String name; private String location;... } <class name="department" identity-type="application" table="dept"> package.jdo <field name="deptno" primary-key="true"> <column name="deptno" precision="2" allows-null="false"/> </field> <field name="name"> <column name="dname" length="14" jdbc-type="varchar"/> </field> <field name="location"> <column name="loc" length="13" jdbc-type="varchar" default-value="nyc"/> </field> </class>

Odwzorowanie O/R 90 Związek 1-1 jednokierunkowy Manager - mgrno: int - name: String 1 1 Department -deptno: int -manager: Manager <class name="department" identity-type="application" table="dept"> <field name="deptno" primary-key="true" persistence-modifier="persistent"> <column name="deptno" precision="2" jdbc-type="number"/> </field> <field name="manager" persistence-modifier="persistent"> <column name="mgr" precision="10" jdbc-type="number"/> </field> </class> <class name="manager" identity-type="application" table="emp"> <field name="mgrno" primary-key="true" persistence-modifier="persistent"> <column name="empno" precision="4" jdbc-type="number"> </field> <field name="name" persistence-modifier="persistent"> <column name="ename" length="10" jdbc-type="varchar"/> </field> </class> package.jdo

Odwzorowanie O/R 91 Związek 1-1 dwukierunkowy jeden klucz obcy dwa klucze obce Manager - mgrno: int - name: String - dept: Department 1 1 Department -deptno: int -manager: Manager <class name="department" identity-type="application" table="dept"> <field name="deptno" primary-key="true" persistence-modifier="persistent"> <column name="deptno" precision="2" jdbc-type="number"/> </field> <field name="manager" persistence-modifier="persistent"> <column name="mgr" precision="10" jdbc-type="number"/> </field> </class> <class name="manager" identity-type="application" table="emp">... <field name="dept" persistence-modifier="persistent" mapped-by="user"> <column name="deptno" precision="2" jdbc-type="number"/> </field> </class> package.jdo

Odwzorowanie O/R 92 Związek 1-N List, Set, Map tabela, klucz obcy jedno- i dwukierunkowy Employee - empno: int - dept: Department Department -deptno: int - employees: Collection <class name="department" identity-type="application" table="dept">... <field name="employees" persistence-modifier="persistent" mapped-by="department"> <collection element-type="pl.org.ploug.szkola2006.jdo.employee"/> </field> </class> <class name="employee" identity-type="application" table="emp">... <field name="dept" persistence-modifier="persistent" mapped-by="user"> <column name="deptno" precision="2" jdbc-type="number"/> </field> </class> package.jdo

Odwzorowanie O/R 93 Związek N-M List, Set, Map tabela, dwie tabele Employee - empno: int - projects: Collection Project - projno: int - employees: Collection <class name="project" identity-type="application" table="proj">... <field name="employees" persistence-modifier="persistent" mapped-by="projects"> <collection element-type="pl.org.ploug.szkola2006.jdo.employee"/> </field> </class> <class name="employee" identity-type="application" table="emp">... <field name="projects" persistence-modifier="persistent" table="emp_proj"> <collection element-type="pl.org.ploug.szkola2006.jdo.project"/> <join><column name="empno"/></join> <element><column name="projno"/></element> </field> </class> package.jdo

Dodatkowe możliwości O/R 94 JDO umożliwia że następujące operacje: utrwalanie obiektów zagnieżdżonych, serializację składowych do składnicy danych (dotyczy przede wszystkim składowych z interfejsu Collections), definiowanie indeksów na polach, definiowanie ograniczeń unikalnych definiowanie ograniczeń referencyjnych i integralnościowych, utrwalanie hierarchii klas, utrwalanie składowych będących tablicami w postaci osobnej kolumny, w postaci serializowanej, przy użyciu tabeli połączeniowej, przy wykorzystaniu klucza obcego.

Transakcje i zapytania 95

Transakcje 96 Zarządzanie transakcjami lokalne: użytkownik jawnie podaje początek i koniec transakcji, przez szkielet aplikacyjny: transakcje są rozpoczynane i kończone automatycznie przez szkielet (np. Spring), przez kontener J2EE: kontrola nad transakcjami jest całkowicie przekazana do kontenera. Typy transakcji pesymistyczne: przed wykonaniem operacji na obiekcie zakładana jest blokada, możliwe stosowanie blokad intencjonalnych (SELECT... FOR UPDATE...), możliwe ustalanie poziomów izolacji transakcji, optymistyczne: przed wykonaniem operacji sprawdzana jest spójność danych na podstawie zawartości znacznika czasowego operacje wykonywane poza transakcjami javax.jdo.option.nontransactionalread javax.jdo.option.nontransactionalwrite

Transakcje PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(props); PersistenceManager pm = pmf.getpersistencemanager(); 97 Transaction tx = pm.currenttransaction(); try { tx.begin(); // kod aplikacji tx.setsynchronization(new javax.transaction.synchronization() { public void beforecompletion() { // przed zatwierdzeniem lub wycofaniem } public void aftercompletion(int status) { if (status == javax.transaction.status.status_rolledback) // transakcja została wycofana if (status == javax.transaction.status.status_committed) // transakcja została zatwierdzona } }); tx.commit(); } finally { if (tx.isactive()) { tx.rollback(); } }

Zapytania 98 Zapytanie wykorzystujące rozszerzenie klasy Extent e = pm.getextent(department.class,true); Query q = pm.newquery(e); q.setordering("name ascending"); Collection c = (Collection)q.execute(); Iterator i = c.iterator(); porządek krotek wykonanie zapytania while (i.hasnext()){ Department d = (Department)i.next(); System.out.println("Department " + d.getname() + " " + d.getlocation()); } Department ACCOUNTING NEW YORK Department CONTROLLING NEW YORK Department OPERATIONS BOSTON Department RESEARCH DALLAS Department SALES CHICAGO

Zapytania 99 Zapytanie nazwane w pliku konfiguracyjnym Query q = pm.newnamedquery(department.class,"newyorkdepartments"); Collection c = (Collection)q.execute(); Iterator i = c.iterator(); while (i.hasnext()){ Department d = (Department)i.next(); System.out.println("Department " + d.getname() + " " + d.getlocation()); } Department ACCOUNTING NEW YORK Department CONTROLLING NEW YORK <class> package.jdo... <query name="newyorkdepartments" language="javax.jdo.query.jdoql"> <![CDATA[ SELECT FROM Department WHERE location == "NEW YORK" ]]> </query> </class>

Zapytania 100 Zapytanie JDOQL String filter = " location == plocation && employees.contains(emp) " + " && emp.job == pjob && emp.name.startswith(\"s\") && emp.salary > 1000"; Extent e = pm.getextent(department.class,true); Query q = pm.newquery(e,filter); q.declareimports("import pl.org.ploug.szkola2006.jdo.employee"); q.declarevariables("employee emp"); q.declareparameters("string plocation, String pjob"); Collection c = (Collection)q.execute("DALLAS","ANALYST"); Iterator i = c.iterator(); zmienne zmienne wiązania while (i.hasnext()){ Department d = (Department)i.next(); System.out.println("Department " + d.getname() + " " + d.getlocation()); } Department RESEARCH DALLAS

Zapytania 101 Zapytanie SQL Query q = pm.newquery("javax.jdo.query.sql", "SELECT dname, count(ename) FROM dept LEFT OUTER JOIN emp USING (deptno) GROUP BY dname"); List l = (List)q.execute(); Iterator i = l.iterator(); while (i.hasnext()){ Object[] o = (Object[])i.next(); System.out.println("Department " + o[0] + ", number of employees: " + o[1]); } Department ACCOUNTING, number of employees: 3 Department OPERATIONS, number of employees: 0 Department CONTROLLING, number of employees: 1 Department RESEARCH, number of employees: 5 Department SALES, number of employees: 6

Zapytania 102 Zapytanie złożone Extent e = pm.getextent(employee.class, true); Query q = pm.newquery(e); q.setordering("name ascending"); q.setrange(1,5); Collection c = (Collection)q.execute(); Iterator i = c.iterator(); ograniczenie rozmiaru wyniku while (i.hasnext()){ Employee emp = (Employee)i.next(); String boss = ((emp.getboss()!= null))? emp.getboss().getname() : ""; String department = ((emp.getdepartment()!= null))? emp.getdepartment().getname() : ""; System.out.println("Employee " + emp.getname() + " Department: " + department + " Boss: " + boss); } Employee ALLEN Department: SALES Boss: BLAKE Employee BLAKE Department: SALES Boss: KING Employee CLARK Department: ACCOUNTING Boss: KING Employee FORD Department: RESEARCH Boss: JONES

Metody callback Trwałe klasy mogą implementować interfejs InstanceCallbacks informujący klasę o zdarzeniach związanych z cyklem życia danej klasy. 103 public class Employee implements InstanceCallbacks { String name; String job;... public void jdopostload() {... } public void jdopreclear() {... } public void jdoprestore() {... } public void jdopredelete() {... } } public interface AttachCallback { public void jdopreattach(); public void jdopostattach(object attached); } public interface DetachCallback { public void jdopredetach(); public void jdopostdetach(object detached); }

104 Zarządzanie pamięcią cache i dziennikiem Poziomy pamięci cache wymagane przez JDO poziom 1: instancje buforowane w PersistentManager WeakRefCache, SoftRefCache, HardRefCache poziom 2: instancje buforowane w PersistentManagerFactory JDO wykorzystuje bibliotekę Log4J (http://jakarta.apache.org/log4j) do zapisu plików dziennika. Biblioteka ta umożliwia elastyczną konfigurację dziennika kategorie zdarzeń, poziomy komunikatów, format pliku dziennika.