Cílem object-to-relational (O2R) projektů (frameworků, chcete-li) je umožnit programátorovi snadno přistupovat k záznamům v databázi tak, jako by to byly přímo uložené objekty v jazyce, ve kterém programuje. Takových řešení je mnoho (viz odkazy na konci článku) a bylo popsáno hodně papíru a vytvořeno mnoho specifikací, které se tím zabývají. Asi nejznámější z nich je ODMG. Jakarta OJB je knihovna pro jazyk Java, která splňuje požadavky specifikací ODMG, JDO a PersistenceBroker.
Jakarta OJB (dále jen OJB) má tu výhodu, že je zadarmo a je, ostatně jako všechny jiné projekty Apache Jakarta, dobře dokumentována. Hned na začátek bych chtěl ubezpečit všechny čtenáře, kteří neprogramují v Javě, že i pro ně může být přečtení článku užitečné. Specifikace ODMG totiž spolehlivě funguje i v jiných jazycích.
V současné době je OJB ve verzi 0.9, protože ještě není zcela hotová implementace JDO. Avšak ODMG 3.0 je již plně funkční a právě touto implementací se budeme nadále zabývat. PersistenceBroker API je totiž na nižší úrovni a slouží ke specifickým účelům nebo k vytváření dalších implementací. JDO je specifikace, kterou vytvořil Sun a týká se tedy Javy. Je to jakási paralela ODMG, dokonce lidé, kteří vytvářeli ODMG, jsou v týmu JDO. Až bude JDO v OJB naimplementována, bude to pro programátora v Javě pravděpodobně lepší volba.
Tým OJB plánuje v budoucnu podporovat i jiné zdroje, než jsou relační databáze. Na obrázku jsou žlutě vyznačeny moduly, jako jsou ODBMS (objektová databáze) nebo XML. Vrstva OTM je jakousi mezivrstvou, která se nyní formuje při vytváření JDO specifikace.
ODMG definuje mnoho zajímavých funkcí. Jednak je to samozřejmě API, pomocí které se všechno ovládá, a dále pak OQL (Object Query Language), který usnadňuje vytvářet dotazy, nebo OT (Object Transactions) přidávající podporu transakcí. Mezi další důležité vlastnosti, jež specifikace pokrývá, je ošetření vícevláknového přístupu do databáze či connection pooling. Dost teorie, jdeme na to.
Vytvořme tabulku v relační databázi, která bude obsahovat několik jednoduchých polí. Tento příklad je pro databázi Hypersonic SQL.
CREATE TABLE PRODUCT ( ID INT PRIMARY KEY, NAME CHAR(100), PRICE DOUBLE, STOCK INT ) |
Tabulka produktů |
Vytvoření mapování na objekty se provádí v OJB pomocí XML souboru. V něm definujeme, která pole připadnou atributům tříd.
<class-descriptor class="org.apache.ojb.broker.Product" table="PRODUCT"> <field-descriptor id="1" name="id" column="ID" jdbc-type="INTEGER" primarykey="true" autoincrement="true"/> <field-descriptor id="2" name="name" column="NAME" jdbc-type="VARCHAR"/> <field-descriptor id="3" name="price" column="PRICE" jdbc-type="DOUBLE"/> >field-descriptor id="4" name="stock" column="STOCK" jdbc-type="INTEGER"/> </class-descriptor> |
Mapování na objekt Product |
Jak vidíme, nastavení databáze je snadné. Můžeme nyní zkusit vyzvednout objekty přímo v Javě.
|
|
1 |
|
Java2html |
K vytvoření dotazu jsme použili OQL (řádek 52). Pro bližší seznámení s OQL bych doporučil odkazy na konci článku. Po provedení dotazu (ř.56) dostaneme kolekci objektů Product. S těmi pracujeme jako s obyčejnými objekty. Vkládání nebo aktualizace objektů je ještě snazší.
|
|
1 |
{ |
Java2html |
OJB v tomto případě zajistí vytvoření nového primárního klíče a jeho nastavení na nejvyšší hodnotu (tzv. autoincrement). Objekt je nutno zablokovat, aby jej mohl OJB bezpečně připravit k uložení. Poté stačí jen „komitnout“ transakci a je to. Objekt byl uložen. Aktualizace probíhá obdobně. Nejprve vyzvedneme objekt z databáze a poté jej uložíme zpět. U aktualizace je nutno také objekt nejprve zablokovat pro zápis, aby jej nikdo jiný mezitím v databázi nezměnil.
OJB není jen suchou implementací ODMG/JDO. Umí toho samozřejmě více. Podporuje škálovatelnost distribuováním zátěže na více databázových serverů. S pomocí OJB můžete dokonce pracovat na více databázích současně (nemusejí být stejné platformy). OJB má moderní modulární architekturu umožňující vytvářet vlastní pluginy a měnit metadata přímo za běhu. Je to skutečně profesionální produkt, který se neztratí ani mezi těmi nejdražšími O2R řešeními.
Odkazy: