Představte si situaci, kdy ve vaší účetní aplikaci pracujete s třídou ucto.faktura, definovanou v Javě třeba takto:

package ucto;

// vystavene faktury
public class faktura {

public String cislo_faktury;
public Date datum_vystaveni;
public ArrayList<polozka> polozky; // reference na tridu ucto.polozka
public String prijemce;
public Boolean vystavena;
public Date splatno_ke_dni;
public Boolean splaceno;
public Float castka;

}

S touto třídou ve své aplikaci budete chtít manipulovat následujícím způsobem:

  • Vytvářet nové faktury a vystavovat je
  • Ukládat faktury do databáze a prohlížet si jejich obsah
  • Provádět dotazy nad fakturami za nějakou část účetního období, např. sledovat saldo mezi přijatými a vystavenými fakturami, nebo hledat faktury po době splatnosti, a to prostřednictvím oblíbeného reportovacího nástroje pracujícího s SQL.
K tomu, aby se naše Java třídy „naučily“ ukládat data do databáze Caché nám stačí provést jen několik málo kroků.
  1. K již vytvořeným Java třídám přidáme anotace, které budou Caché poskytovat informace o třídě samotné a další informace, např. o indexech které se mají vytvářet atd…
  2. Spustíme importovací utilitu, která k vybraným Java třídám vytvoří v Caché odpovídající persistentní třídy.
  3. V aplikaci budeme používat API Jalapeno runtime knihoven k manipulaci s daty uloženými v Caché.

Pojďme se nejdříve podívat na anotace Caché.

V Java J2EE verzi 1.5 byl zaveden nový prvek – anotace. Syntakticky vycházejí z javadoc značek a nemají vliv na samotný Java kód, ale mohou velice významným způsobem ovlivňovat způsob práce různých nástrojů a knihoven. Na rozdíl on jiných API, jako např. EJB, nevyžadují externí soubory tuto interakci popisující, ale jsou součástí samotného Java kódu.

Caché implementuje různé anotace, které lze v zásadě členit na anotace na úrovni třídy a anotace na úrovni vlastností.

Příkladem anotace na úrovni třídy je např. @CacheClass() nebo @Index(), příkladem anotace na úrovni vlastnosti je @CacheProperty().

Každá anotace obsahuje různě dlouhý seznam atributů určujících chování kompilátoru Caché.

Např. @CacheClass(name=”ucto.faktura”, xmlSerializable=true) říká kompilátoru Caché, že vytvořená třída bude nazvána „ucto.faktura“, bude persistentní (výchozí hodnota, není nutno specifikovat) a bude obsahovat XML schopnosti – ty jsou v Caché získány poděděním od třídy %XML.Adaptor.

package ucto;
import com.intersys.pojo.annotations.*;

// vystavene faktury
@CacheClass(name=”ucto.faktura”, xmlSerializable=true)
public class faktura {

public String cislo_faktury;
public Date datum_vystaveni;
public ArrayList<polozka> polozky; // reference na tridu ucto.polozka
...

}

Definice vygenerované Caché třídy bude tedy vypadat takto:

Class ucto.faktura extends (%Persistent, %XML.Adaptor) { … tělo třídy … }

Řekněme, že pro účely rychlého vyhledávání podle čísla faktury budeme chtít, aby Caché vytvořila nad vlastností cislo_faktury index. Zároveň, protože Caché nedovolí použít podtržítko v názvech tříd nebo vlastností, budeme specifikovat alternativní název některých vlastností. Zároveň budeme chtít definovat v Caché vztah one-to-many mezi třídami faktura a polozka.

package ucto;
import com.intersys.pojo.annotations.*;

// vystavene faktury
@CacheClass(name=”ucto.faktura”, xmlSerializable=true)
@Index(name=”cislofakturyIndex”, isUnique=true, propertyNames={“cislofaktury”})
public class faktura {

@CacheProperty(name=”cislofaktury”)
public String cislo_faktury;

@CacheProperty(name=”datumvystaveni”)
public Date datum_vystaveni;

@Relationship(type=RelationshipType.ONE_TO_MANY, inverseClass="ucto.polozka", inverseProperty="faktura")
public ArrayList<polozka> polozky; // reference na tridu ucto.polozka

public String prijemce;
public Boolean vystavena;

@CacheProperty(name=”splatnokedni”)
public Date splatno_ke_dni;
public Boolean splaceno;
public Float castka;

}

Takto upravená definice třídy povede k vytvoření následující třídy v Caché.

Class ucto.faktura Extends (%Library.Persistent, %XML.Adaptor) [ SqlTableName = faktura ]
{

Property castka As %Library.Float(JAVATYPE = "java.lang.Float");
Property cislofaktury As %Library.String(JAVATYPE = "java.lang.String", MAXLEN = 4096) [ ClientName = cislo_faktury ];
Property datumvystaveni As %Library.Date(JAVATYPE = "java.util.Date") [ ClientName = datum_vystaveni ];
Relationship polozky As ucto.polozka(JAVATYPE = "java.util.ArrayList") [ Cardinality = many, Inverse = faktura ];
Property prijemce As %Library.String(JAVATYPE = "java.lang.String", MAXLEN = 4096);
Property splacena As %Library.Boolean(JAVATYPE = "java.lang.Boolean");
Property splatnokedni As %Library.Date(JAVATYPE = "java.util.Date") [ ClientName = splatno_ke_dni ];
Property vystavena As %Library.Boolean(JAVATYPE = "java.lang.Boolean");
Index cislofakturyIndex On cislofaktury [ Unique ];
XData JavaBlock
{

<JavaBlock>
<Package implementation="ucto.cache" pojo="ucto"></Package>
<UseSameNames>false</UseSameNames>
<Name implementation="faktura" pojo="faktura"></Name>
<ResolveNameCollisions>false</ResolveNameCollisions>
<EagerFetchRequired>true</EagerFetchRequired>
</JavaBlock>

}

}

O tom, jak třídu v Caché pomocí průvodce vytvoříme, si povíme příště.