Hlavní navigace

Jakarta OJB

Lukáš Zapletal 23. 1. 2003

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?

25. 2. 2003 10:13

Radovana Straube (neregistrovaný)

V sucasnosti pouzivam na prepojenie DB-Java projekt Castor. Castor umoznuje aj prevod Java-XML. Cele mapovanie (DB-Java-XML) sa da nakonfigurovat v jedinom XML-subore. Zaujimalo by ma, ci aj Jakarta OJB poskytuje moznost prevodu Java-XML, pripadne rovno DB-XML. Dakujem.

24. 1. 2003 13:47

martin sarfy (neregistrovaný)

chtel bych upozornit na perlovsky modul Class::DBI, ktery dela SQL abstrakci - vy odvodite svou tridu od Class::DBI a reknete, ve ktere tabulce jsou objekty teto tridy a jake sloupecky ta tabulka ma, a na oplatku zdedite funkce jako create_new, delete, retrieve_all, search a rovnez pristupove metody pro vsechny atributy zaznamu.
modul rovnez zvlada cizi klice, pri pristupu k atributu ktery nekam ukazuje je z DB nacten cilovy objekt, umi triggery - perl funkce ktere budou spusteny pri urcite mo…

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Vitalia.cz: Jste stále nemocní? Chybí vám zinek

Jste stále nemocní? Chybí vám zinek

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Vitalia.cz: Dáte si jahody s plísní?

Dáte si jahody s plísní?

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: Na poslední chvíli šokuje výjimkami v EET

Na poslední chvíli šokuje výjimkami v EET

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?