Metody dostępu do danych dr inż. Grzegorz Michalski Na podstawie wykładów dra inż. Juliusza Mikody
Wyjątki JDO Specyfikacja JDO definiuje zbór wyjątków, które mogą być zgłoszone przez implementację JDO. Wszystkie wyjątki mogą być zgłaszane w dowolnym momencie, nie tylko podczas wywoływania metod JDO. Wyjątek może być zgłoszony podczas poruszania się po grafie obiektów (obiekty mogą być czytane w czasie gdy chcemy się do nich odwołać). Wyjątki można podzielić na dwie zasadnicze grupy: Krytyczne po których musi nastąpić ponowne uruchomienie aplikacji oraz niekrytyczne błędy wykonania pojedynczych operacji (możliwe jest ponowienie błędnie wykonanej operacji).
Obsługa wyjątków Aplikacja powinna obsługiwać wszystkie wyjątki (nie tylko związane z implementacja JDO). W szczególności aplikacja powinna zapewnić poprawne zamkniecie instancji PersistanceManager: PersistenceManager pm = null; try { pm = pmf.getpersistencemanager(); // Transakcje JDO pm.close(); } finally { if (pm!= null &&!pm.isclosed()) { if (pm.currenttransaction().isactive()) { pm.currenttransaction().rollback(); } pm.close(); } }
Klasy wyjątków Klasa JDOException jest klasą bazową dla wszystkich wyjątków JDO. Definiuje metody dla wszystkich klas wyjątków JDO. Przesłania także metody tostring() oraz printstacktrace(). Metody wspólne dla wszystkich wyjątków JDO: Object getfailedobject() - obiekt trwały, którego dotyczy wyjątek Throwable[] getnestedexceptions() - tablica zagnieżdżonych wyjątków jeżeli takie zagnieżdżenie miało miejsce.
Klasy wyjątków JDOFatalException klasa bazowa dla wszystkich wyjątków krytycznych. Reakcją na taki wyjątek jest ponowne rozpoczęcie transakcji lub w skrajnych przypadkach ponowne nawiązanie połączenia z bazą danych. JDOFatalUserException wyjątek ten wskazuje na błąd krytyczny spowodowany przez aplikację. Zwykle wskazuje, że aplikacja wywołała metodę JDO w nieodpowiednim momencie np: przy braku połączenia z bazą danych.
Klasy wyjątków JDOFatalInternalException Wyjątek ten sygnalizuje błąd krytyczny w obrębie implementacji JDO. JDOFatalDataStoreException Wyjątek ten sygnalizuje błąd krytyczny w obrębie systemu bazy danych np: wygaśniecie transakcji, utrata połączenia. JDOOptimisticVerificationException Wyjątek ten sygnalizuje, że zakończenie transakcji nie powiodło się wyjątek zgłaszany jest jedynie podczas wykonywania metody commit().
Klasy wyjątków JDOCanRertyException Wyjątek ten stanowi klasę bazową dla wyjątków niekrytycznych. JDOUnsupportedOptionException Wyjątek ten sygnalizuje błąd użycia opcjonalnej funkcjonalności, która nie jest obsługiwana w danej implementacji JDO. JDOUserException Wyjątek ten sygnalizuje błąd spowodowany przez aplikacje np: próba zapisu w bazie danych klasy niezdolnej do trwałości.
Klasy wyjątków JDODataStorageException Wyjątek ten sygnalizuje błąd niekrytyczny, który wystąpił w bazie danych. JDOObjectNotFoundException Wyjątek ten sygnalizuje błąd spowodowany przez aplikację. Obiekt trwały nie może być odnaleziony w bazie danych np: odwołanie do obiektu trwałego przez referencje, gdzie obiekt ten został usunięty z bazy danych przez inną instancję aplikacji.
Tożsamość obiektów JDO gwarantuje, że dla danej instancji PersistanceManager istnieje dokładnie jedna instancja obiektu trwałego. Właściwość ta nosi nazwę unikalności. Właściwość ta gwarantuje, że w pamięci istnieje tylko jedna reprezentacja obiektu trwałego niezależnie od tego, ile razy zostanie on odnaleziony.
Tożsamość obiektów Transaction tx = pm.currenttransaction(); tx.begin(); Osoba o1 = new Osoba("Iksi ski", "Robert", 10); pm.makepersistent(o1); tx.commit(); tx.begin(); Query q = pm.newquery(osoba.class, "nazwisko == \"Iksi ski\""); Collection<Osoba> o = (Collection<Osoba>) q.execute(); Osoba o2 = o.iterator().next(); if (o1 == o2) System.out.println( "Jeden i ten sam obiekt");
Tożsamość obiektów W pamięci JVM może istnieć wiele obiektów klasy PersistanceManager, co powoduje że w pamięci może istnieć wiele instancji tego samego obiektu trwałego. A dokładniej po jednej instancji obiektu trwałego dla każdej instancji klasy PersistanceManager. Każda z tych instancji będzie posiadała tożsamość obiektu w sensie JDO. Klasa JDOHelper posiada metodę umożliwiając pobranie tożsamości obiektu w sensie JDO: static Object getobjectid(object ps)
Tożsamość obiektów PersistenceManager pm1 = pmf.getpersistencemanager(); Transaction tx1 = pm1.currenttransaction(); tx1.begin(); Osoba o1 = new Osoba("Iksi ski", "Robert", 10); pm1.makepersistent(o1); PersistenceManager pm2 = pmf.getpersistencemanager(); Transaction tx2 = pm2.currenttransaction(); tx2.begin(); Query q = pm2.newquery(osoba.class, "nazwisko == \"Iksi ski\""); Collection<Osoba> o = (Collection<Osoba>) q.execute(); Osoba o2 = o.iterator().next(); if (o1!= o2) System.out.println("Ró ne obiekty w pami ci"); Object oo1 = JDOHelper.getObjectId(o1); Object oo2 = JDOHelper.getObjectId(o2); if (oo1.equals(oo2)) System.out.println( "Reprezentacja JDO ta sama");
new Stan obiektów begin Transient Stan ulotny makepersistance Persistent Stan trwały Hollow Stan pusty rollback commit deletepersistance commit edit Persistent Stan trwały Dirty Stan zmieniony commit
Informacje o stanie obiektu Klasa JDOHelper posiada metody określające aktualny stan obiektu trwałego: static boolean isdeleted(java.lang.object pc) static boolean isdetached(java.lang.object pc) static boolean isdirty(java.lang.object pc) static boolean isnew(java.lang.object pc) static boolean ispersistent(java.lang.object pc) static boolean istransactional(java.lang.object pc)
Transakcje Transakcje JDO są ściśle powiązane z transakcjami JDBC Transakcja JDO według specyfikacji gwarantuje, że implementacja JDO posiada własność ACID Atomic (Atomowość), Consistent (Spójność), Isolated (Izolacja), Durable (Trwałość). JDO może opcjonalnie obsługiwać transakcje optymistyczne. Transakcje takie szczególnie są przydatne jeśli wykonanie transakcji wymaga dłuższego okresu czasu i w związku z tym przetrzymywanie zasobów nie jest wskazane.
Własności transakcji NontransactionalRead określa możliwość odwołania się do własności obiektu trwałego poza transakcjami. NontransactionalWrite określa możliwość modyfikacji obiektu trwałego poza transakcjami. Optimistic określa czy transakcja jest optymistyczna RestoreValues przewracanie wartości obiektom z momentu przed rozpoczęciem transakcji po wycofaniu danej transakcji RetainValues pozostawienie wartości pól obiektów trwałych po zakończeniu transakcji
Źródła Java Data Objects, Sameer Tyagi, Keiron McCammon, Michael Vorburger, Heiko Bobzin 2004 http://db.apache.org/jdo/ http://www.datanucleus.org/products/accessplatform_3_0/in dex.html