Java Data Objects
Słownik Persystencja Transakcja RDBMS ODBMS
JDO to standard Producenci (vendors) dostarczają implementacji standardu JPOX (RDBMS) Orient (ODBMS) inteliBO (RDBMS) ObjectDB
Dlaczego JDO? Można zmienić silnik bazy danych a nawet typ bazy danych bez zmian w kodzie. Nie trzeba tworzyć struktury bazy danych (koniec z normalizacją) Twoje klasy nie muszą implementować żadnych specjalnych interfejsów
Trzy rodzaje klas w JDO Persistence Capable – mamy dla nich wygenerowany plik *.jdo (deskryptor) Persistence Aware – te które manipulują instancjami Persistence Capable Normal – klasy które nie mają nic wspólnego z JDO
Menadżer Persystencji (Slajd samokomentowalny) Properties props=new Properties(); props.put("javax.jdo.PersistenceManagerFactoryClass","org.jpox.PersistenceManagerFactoryImpl"); props.put("javax.jdo.option.ConnectionDriverName","com.mysql.jdbc.driver"); props.put("javax.jdo.option.ConnectionURL","jdbc:mysql://localhost/jpox"); props.put("javax.jdo.option.ConnectionUserName","mysql"); props.put("javax.jdo.option.ConnectionPassword",""); PersistenceManagerFactory pmf=JDOHelper.getPersistenceManagerFactory(props); PersistenceManager pm=pmf.getPersistenceManager(); Można też zczytać ustawienia z pliku lub poprzez Java Naming and Directory Interface
Rodzaje obiektów w JDO (nomenklatura) Transient Persistent New Persistent Dirty Hollow Persistent Clean Persistent Deleted Persistent New Deleted Persistent Non-transactional Transient Clean Transient Dirty Detached Clean Detached Dirty
makePersistent() Transaction tx=pm.currentTransaction(); try { tx.begin(); Product product=new Product("Sony Discman","A standard discman from Sony",49.99); pm.makePersistent(product); tx.commit(); } finally if (tx.isActive()) { tx.rollback(); }
Aktualizacja wpisu w bazie danych Transaction tx=pm.currentTransaction(); try { tx.begin(); String product_name=product.getName(); ... product.setPrice(75.0); tx.commit(); } finally if (tx.isActive()) { tx.rollback(); }
deletePersistent() Transaction tx=pm.currentTransaction(); try { tx.begin(); String product_name=product.getName(); ... pm.deletePersistent(product); tx.commit(); } finally if (tx.isActive()) { tx.rollback(); }
Cały diagram stanów
Przenieść obiekt w stan Transient – makeTransient() Wszystko to dzieje się podczas trwania transakcji, co zrobić by dowolnie modyfikować obiekt bez zmian w bazie danych? Przenieść obiekt w stan Transient – makeTransient() Odłączyć obiekt – detachCopy() Użycie nonTransactional[Read/Write]()
Wiemy jak zapisywać do bazy danych, jak wczytać obiekt z bazy?! Object identity = pm.getObjectId(obj); Object obj = pm.getObjectById(identity); Użycie JDOQL – JDO Query Language Query q = pm.newQuery(MyClass.class, "field1 < value"); q.declareParameters("int value"); List results = q.execute(205); Iterator iter = results.iterator(); while (iter.hasNext()) { MyClass obj = (MyClass)iter.next(); }
Alternatywa dla JDOQL (brutalna) Użycie Extent’u Extent e = pm.getExtent(MyClass.class, true);
Persistence-by-reachability Inne ważne cechy Persistence-by-reachability class Moja { innaMojaKlasa other; } Fetch-grupy Kiedy „wyjmujemy” obiekt z bazy danych nie wszystkie jego pola muszą być pobierane od razu. Można ukreślać własne Fetch-grupy
Wszystko tu to banały... O co naprawdę chodzi? Transakcje optymistyczne i pesymistyczne Wsparcie dla samo-replikowalnych baz danych
Jakie to proste! (W teorii) Ściągamy plugin do Eclipsa Włączamy „support” JPOX Plugin generuje nam plik *.jdo Po każdym build’dzie JPOX modyfikuje nasze klasy tak, że są „Persistence Capable” Możemy pisać kod naszej aplikacji używając sformułowań JDO
Zderzenie teorii z praktyką(SMUTNE)