Java Data Objects

advertisement
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)
Download