Navigace

Hlavnφ menu

 

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:

public class Osoba
{
    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:

Osoba karel = new Osoba("Karel", "Novak", 32);

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:

/* Inicializace persistence */
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):

Transaction tx = pm.currentTransaction();
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.

Burget, Radek (6. 1. 2005)

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!