Java Data Objects
-
Upload
melodie-cantu -
Category
Documents
-
view
42 -
download
0
description
Transcript of Java Data Objects
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.PersistenceMana
gerFactoryImpl"); 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
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-reachabilityclass Moja{
innaMojaKlasa other;}
• Fetch-grupyKiedy „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)