Hlavní navigace

Jakarta OJB

Lukáš Zapletal

Svět internetu a počítačů se točí kolem informací a všechny ty informace se musejí někam ukládat. Nejefektivnějším úložištěm jsou a zřejmě budou relační databáze. Jenže celý svět píše programy objektově. Právě proto vznikly object-to-relational knihovny. Jakarta OJB je jednou z nich.

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.

Tabulka č. 362
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.

Tabulka č. 363
<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ě.

Tabulka č. 364

Seznam.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

// JavaBean objekt pro ulozeni produktu
private class Product {
// identifikator pro ODMG
private int _id;

// nazev produktu
protected String name;
// jeho cena
protected double price;
// kusu na sklade
protected int stock;

public String getName() {
return name;
}

public void setName(String n) {
name = n;
}

// ... a tak dale pro vsechny atributy

public String toString() {
return new String("Name: " + name +
", price: " + price +
", stock: " + stock + "\n");
}
}

public class Seznam {
public static void main(String[] argv) {

// vytvorime instanci ODMG
Implementation odmg = OJB.getInstance();

// otevreme databazi
Database db = odmg.newDatabase();
try {
db.open("repository.xml",
Database.OPEN_READ_WRITE);
} catch(ODMGException ex) {
ex.printStackTrace();
}

// otevreme transakci
Transaction tx = odmg.newTransaction();

try {
tx.begin();

OQLQuery query = odmg.newOQLQuery();
query.create("select allproducts " +
"from " + Product.class.getName());

// provedeni dotazu
DList allProducts = (DList) query.execute();
tx.commit();

// vypsani na obrazovku
Iterator iter = allProducts.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
} catch (Throwable t) {
// rollback pri chybe (pro uplnost)
tx.abort();
}
}
}
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ší.

Tabulka č. 365

Ulozeni.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
Product newProduct = new Product();
newProduct.setName("Triko s logem root");
newProduct.setPrice(599.90);
newProduct.setStock(20);

Transaction tx = odmg.newTransaction();
tx.begin();

// zablokujme objekt pro zapis
tx.lock(newProduct, tx.WRITE);

tx.commit();
}
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:

Našli jste v článku chybu?