JDO - Java Data Objects
P°i tvorb∞ aplikacφ, kterΘ pracujφ s v∞tÜφmi objemy dat, v₧dy d°φve Φi pozd∞ji narazφme na problΘm, jak²m zp∙sobem a kam data uklßdat. Standardem pro uklßdßnφ dat jsou v dneÜnφ dob∞ relaΦnφ databßze, kterΘ dan² ·kol plnφ velmi efektivn∞, p°iΦem₧ m∙₧eme volit z ÜirokΘ nabφdky jak voln∞ Üφ°en²ch, tak komerΦnφch implementacφ. Programujeme-li v Jav∞, mßme hned n∞kolik mo₧nostφ, jak relaΦnφ databßze vyu₧φt.
Jak uklßdat data v Jav∞
V prvnφ °ad∞ m∙₧eme pou₧φt standardnφ rozhranφ JDBC, kterΘ umo₧≥uje p°φmo p°istupovat k prakticky libovolnΘ relaΦnφ databßzi pomocφ jazyka SQL. Toto °eÜenφ je implementaΦn∞ nenßroΦnΘ, nevy₧aduje ₧ßdnΘ nadstavbovΘ balφky, tak₧e v²slednß aplikace m∙₧e b²t velmi malß a efektivnφ. Na druhou stranu se musφme smφ°it s tφm, ₧e si budeme muset sami navrhnout strukturu databßze a implementovat zvlßÜ¥ uklßdßnφ, zm∞nu a zp∞tnΘ zφskßvßnφ ka₧dΘho kousku dat. V okam₧iku, kdy je zapot°ebφ strukturu dat lehce zm∞nit, je zapot°ebφ upravit strukturu p°φsluÜnΘ tabulky a vÜechny SQL p°φkazy s nφ pracujφcφ, co₧ m∙₧e snadno p°er∙st v noΦnφ m∙ru ka₧dΘho programßtora.
Java je ovÜem jazyk objektov∞ orientovan² a vnit°n∞ jsou proto obvykle vÜechna data, se kter²mi pracujeme, reprezentovßna jako objekty. Z tohoto pohledu tedy vypadß rozumn∞ neuklßdat jednotlivΘ datovΘ polo₧ky (tedy jednotlivΘ vlastnosti dan²ch objekt∙), ale donutit objekty, aby se uklßdaly celΘ. M∞jme nap°φklad t°φdu Osoba
definovanou takto:
{
protected String jmeno;
protected String prijmeni;
protected int vek;
public Osoba(String jmeno, String prijmeni, int vek)
{
...
}
}
Ka₧dß osoba, o kterΘ uchovßvßme informace, je tedy reprezentovßna jako objekt t°φdy Osoba
. Mφsto toho, abychom konstruovali SQL p°φkaz, kter² ulo₧φ jmΘno, p°φjmenφ a v∞k osoby do relaΦnφ tabulky (INSERT) a nßsledn∞ obdobnΘ p°φkazy pro zm∞nu (UPDATE) a zp∞tnΘ naΦtenφ (SELECT) t∞chto ·daj∙, nabφzφ se myÜlenka uchovat ka₧d² vytvo°en² objekt jako celek. TakovΘ objekty, jejich₧ existence p°etrvß vlastnφ b∞h aplikace, se naz²vajφ persistentnφ objekty.
Toto °eÜenφ mß mnoho v²hod oproti prostΘmu pou₧itφ relaΦnφ databßze. P°edn∞ objekty, na rozdφl od relacφ, majφ vlastnφ identitu, odpadajφ proto starosti s volbou primßrnφho klφΦe, kter² by v p°edchozφm p°φklad∞ nejspφÜe musel b²t generovßn um∞le. A dßle, pokud b∞hem v²voje aplikace zm∞nφme strukturu objektu (nap°φklad p°idßme osob∞ rodinn² stav), nemusφme revidovat vÜechny SQL p°φkazy.
Nejelegantn∞jÜφ °eÜenφ p°edstavuje p°φmo pou₧itφ objektovΘ databßze, kterß obsahuje JavovskΘ aplikaΦnφ rozhranφ, jako nap°φklad CachΘ. NaneÜt∞stφ objektovΘ databßze dosud zdaleka nedosßhly tak masovΘho rozÜφ°enφ jako databßze relaΦnφ a zatφmco nap°φklad velmi kvalitnφ relaΦnφ MySQL je b∞₧nou souΦßstφ linuxov²ch distribucφ a b∞₧φ na kdejakΘm (i freehostingovΘm) serveru, objektovou databßzi si obvykle m∙₧eme dop°ßt pouze pokud mßme kam si ji sami nainstalovat, nehled∞ k tomu, ₧e se v naprostΘ v∞tÜin∞ jednß o nßkladnΘ komerΦnφ °eÜenφ. Mnohem reßln∞jÜφ °eÜenφ proto p°edstavuje pou₧itφ n∞kterΘho nßstroje pro persistenci objekt∙ s vyu₧itφm relaΦnφ databßze.
V p°φpad∞ Javy je v tomto sm∞ru op∞t z Φeho vybφrat. Standardnφm °eÜenφm je pou₧itφ J2EE a Entity beans, co₧ ovÜem vy₧aduje pod°φdit styl psanφ celΘ aplikace tomuto modelu a pro v∞tÜinu pou₧itφ p°edstavuje p°φsloveΦn² kan≤n na vrabce. Mnohem jednoduÜÜφ °eÜenφ poskytujφ nestandardnφ nßstroje pro persistenci objekt∙ jako Hibernate nebo TopLink, kterΘ zajiÜ¥ujφ persistenci b∞₧n²ch objekt∙ v Jav∞. Ka₧d² z t∞chto nßstroj∙ mß ovÜem svΘ vlastnφ aplikaΦnφ rozhranφ, tak₧e p°φpadn² p°echod k jinΘ implementaci znamenß p°epsßnφ v∞tÜφ Φßsti aplikace. Zbytek Φlßnku proto v∞nujeme popisu standardnφho rozhranφ pro persistenci objekt∙ v Jav∞ s nßzvem Java Data Objects (JDO).
Java Data Objects
TakzvanΘ JDO neboli Java Data Objects je standardizovanΘ aplikaΦnφ rozhranφ pro persistenci objekt∙ v Jav∞, vyvinutΘ p°φmo firmou Sun Microsystems, kterß je i p∙vodcem Javy jako takovΘ. JDO umo₧≥uje implementovat libovoln² zp∙sob uklßdßnφ objekt∙ - m∙₧e slou₧it jako aplikaΦnφ rozhranφ objektovΘ databßze, ale stejn∞ tak m∙₧e provßd∞t mapovßnφ objekt∙ na relaΦnφ tabulky a uklßdat data do relaΦnφ databßze. PodstatnΘ ovÜem je, ₧e aplikaΦnφ rozhranφ je zcela nezßvislΘ na vlastnφ implementaci persistence, a proto aplikace vyu₧φvajφcφ JDO mohou bez v∞tÜφch zm∞n uklßdat data do r∙zn²ch relaΦnφch i objektov²ch databßzφ.
Vytvß°enφ persistentnφch objekt∙
SamotnΘ aplikaΦnφ rozhranφ nenφ nijak slo₧itΘ. V podstat∞ sestßvß z t°φdy PersistenceManagerFactory
, kterß spravuje konfiguraci persistence, PersistenceManager
, kterß implementuje metody pro persistenci objekt∙, a t°φdy Transaction
pro sprßvu transakcφ. VÜechny tyto t°φdy nalezneme v balφku javax.jdo
.
Prßci s persistentnφmi objekty v JDO si nejlΘpe ukß₧eme na p°φkladu. Vytvo°me si pokusn² objekt t°φdy Osoba
:
Chceme-li ulo₧it ·daje o p°φsluÜnΘ osob∞, musφme z vytvo°enΘho objektu ud∞lat objekt persistentnφ. V JDO tak uΦinφme nßsledujφcφm zp∙sobem:
Properties properties = new Properties();
properties.setProperty(..., ...);
...
PersistenceManagerFactory pmfactory =
JDOHelper.getPersistenceManagerFactory(properties);
PersistenceManager pm = pmfactory.getPersistenceManager();
/* ZaΦßtek transakce */
Transaction tx = pm.currentTransaction();
tx.begin();
pm.makePersistent(karel);
/*
... dalÜφ prßce s persistentnφmi objekty ...
*/
/* Konec transakce */
tx.commit();
Prvnφ fßze spoΦφvß v konfiguraci objektu PersistenceManagerFactory
podle toho, kam a jak²m zp∙sobem chceme uklßdat data. Konfigurace spoΦφvß ve vytvo°enφ mno₧iny vlastnostφ (properties), kterΘ udßvajφ zp∙sob p°ipojenφ k databßzi a dalÜφ parametry.
DalÜφm krokem je vytvo°enφ objektu t°φdy PersistenceManager
, kter² se bude starat o persistenci jednotliv²ch datov²ch objekt∙. Tento objekt je vytvo°en pomocφ PersistenceManagerFactory
na zßklad∞ p°edchozφ konfigurace.
Prßce s persistentnφm objektem probφhß v rßmci takzvanΘ transakce. Transakce zaΦφnß volßnφm begin()
a b∞hem jejφho trvßnφ je mo₧no vytvß°et persistentnφ objekty a m∞nit jejich vlastnosti. V okam₧iku ukonΦenφ transakce volßnφm commit()
se aktußlnφ stav persistentnφch objekt∙ ulo₧φ do databßze. V naÜem p°φpad∞ v rßmci transakce pouze uΦinφme z objektu karel
persistentnφ objekt pomocφ volßnφ metody makePersistent()
, Φφm₧ zajistφme, ₧e v okam₧iku volßnφ commit()
se aktußlnφ stav objektu ulo₧φ do databßze.
P°φstup k persistentnφm objekt∙m
Mßme-li persistentnφ objekty ulo₧enΘ v databßzi, bylo by vhodnΘ, abychom se k nim p°i dalÜφm spuÜt∞nφ aplikace op∞t dostali. JDO nabφzφ n∞kolik mo₧nostφ, jak v databßzi najφt po₧adovan² objekt a naΦφst jej tak, aby byl op∞t zpracovateln² v aplikaci.
Pro demonstraci zßkladnφch mo₧nostφ JDO si prozatφm ukß₧eme p°φstup k objekt∙m p°es takzvanΘ extenty. V objektov²ch databßzφch obecn∞ extent p°edstavuje kolekci vÜech objekt∙ danΘ t°φdy ulo₧en²ch v databßzi. V p°φpad∞ JDO probφhß Φtenφ objekt∙ z databßze op∞t v rßmci transakce a typicky vypadß nßsledovn∞ (p°edpoklßdßme ji₧ existujφcφ PersistenceManager
z p°edchozφho p°φkladu):
tx.begin();
Extent extent = pm.getExtent(Osoba.class, false);
for (Iterator i = extent.iterator(); i.hasNext(); ) {
Osoba nekdo = (Osoba) i.next();
/* ... zpracuj informace o osob∞ ... */
}
tx.comit();
Objekty naΦtenΘ z databßze jsou samoz°ejm∞ persistentnφ, tak₧e jakßkoli zm∞na v nich provedenß b∞hem transakce se na konci automaticky ulo₧φ zp∞t do databßze.
JDO - persistentnφ objekty a Java
Java Data Objects je obecnΘ rozhranφ pro persistenci objekt∙ v Jav∞, zajφmavΘ hlavn∞ ve spojenφ s b∞₧n²mi relaΦnφmi databßzemi. Java je objektov∞ orientovan² jazyk, zapome≥me tedy na SQL a uklßdejme do relaΦnφ databßze p°φmo objekty. Tato sΘrie Φlßnk∙ dosud nebyla ukonΦena!
- JDO - r∙znΘ implementace a jejich pou₧itφ
- JDO - Java Data Objects (prßv∞ Φtete)