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.PersistenceManagerFactory Impl"); 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 Nontransactional •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 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); 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)