InterSystems B.V.
Persistentní objekty a Java projekce
V minulém díle jsme si ukázali, jakým způsobem se
provádí připojení k databázi Caché. Dnes budeme
pokračovat a budeme předpokládat, že již existují
třídy, které mají v sobě zabudováno rozhraní pro
persistenci jejich instancí. Takovéto třídy je možné
vygenerovat v prostředí Caché pomocí postupu zvaného
java projekce. V principu to funguje takto.
V prostředí Caché se nadefinují persistentní třídy,
jejichž konkrétní instance chceme do databáze uložit.
Mezi těmito třídami mohou existovat různé
komplikované vazby, obdobně jako v javě. Důležité je,
že při definici tříd se ve zdrojovém kódu uvede i
parametr Projection, definující složku do
které se má vygenerovat zdrojový kód v javě, mající
všechny metody persistentní třídy Caché. Při
kompilaci třídy pak Caché vygeneruje kód použitelný
v prostředí JVM. Ukázka takové jednoduché třídy je
uvedena níže:
Class JCP.Person Extends %Persistent
{
Projection JavaProjection As %Projection.Java(ROOTDIR =
"c:\Home\Java\CP");
Property Name As %String;
Property SSN As %String;
ClassMethod populate(pCount As %Integer) As %Status
{
// zde se nachazi kod pro vytvareni instanci
// . . . . . . .
quit tSC
}
Method myToString() As %String
{
quit "Class: "_..%ClassName(1)
}
}
Modul napsaný v Jythonu pak výše definovanou třídu
volá takto:
# import trid z balicku CacheDB.jar
from com.intersys.objects import *
from JCP import *
# definice funkce pracujici s tridou Person
def workWithPerson():
# vytvotreni instance pripojeni ke Cache
dbconnection=CacheDatabase.getDatabase("jdbc:Cache://localhost:56773/DEV","_system","sys")
# zavolam statickou metodu pro vygenerovani instanci Person
print "Generuji 5 instanci do db:"
Person.populate(dbconnection,5)
# vytvorim instanci tridy Person
print "\nvytvarim instanci rucne a ukladam ji:"
person = Person(dbconnection)
person.setName("Doe, Joe A")
person.setSSN("111-12-1111")
# vypisu jeji vlastnosti
print "\nziskam jeji vlastnosti:"
print "Name: " + person.getName()
print "SSN: " + person.getSSN()
# ulozim instanci do db
person.save()
# zavru instanci a spojeni s db
dbconnection.closeObject(person.getOref())
dbconnection.close()
#
if __name__=="__main__":
workWithPerson()
Výsledek je viditelný níže:
C:\Home\Java\CP>jython CPTest03.py
Generuji 10 instanci do db:
Name: Eagleman,Brenda E.
Name: Lee,Ashley Y.
Name: Munt,Diane I.
Name: Ng,Barbara F.
Name: Umansky,Janice P.
vytvarim instanci rucne a ukladam ji:
ziskam jeji vlastnosti:
Name: Doe, Joe A
SSN: 111-12-1111
Z ukázky je patrné že jsme najednou získali silný
nástroj, který nejenže je schopný díky nástrojům
v Caché vygenerovat použitelné vzorky dat, ale je i
schopný vytvořit na základě definice persistentních
tříd tyto vystavit navenek a zpřístupnit je prostředí
JVM a pomocí Jythonu velice jednoduchým a efektivním
způsobem s těmito definicemi pracovat.
Pokud se nám podařilo uložit instance třídy Person do databáze, očekávali bychom, že
existuje i způsob, jak se k uloženým instancím
dostat. První nejednodušší způsob je, pomocí metody
open(), která identifikuje uloženou
instanci na základě její vlastnosti zvané object
id.
Podívejme se nyní jak je možné pracovat s výše
uvedenou třídou interaktivně za pomocí konzole
Jythonu. Z příkazové řádky si otevřeme konzoli
Jythonu příkazem jython. Otevře se nám
okno, do kterého je možné psát příkazy Jythonu, jaké
bychom psali do modulu. Rozdíl je ten, že zde
okamžitě vidíme výsledek každého příkazu:
C:\Home\Java\CP>jython
Jython 2.2.1 on java1.6.0_04
Type "copyright", "credits" or "license" for more information.
>>> from com.intersys.objects import *
>>> from JCP import *
>>>
>>>
dbconnection=CacheDatabase.getDatabase("jdbc:Cache://localhost:56773/DEV","_system","sys")
>>>
>>> id = Id(1)
>>> person = Person._open(dbconnection, id)
>>>
>>> print person.myToString()
Class: JCP.Person
>>>
>>> print "ID: ", person.getId()
ID: 1
>>>
>>> print "Name: ", person.getName()
Name: Doe, Joe A
>>>
>>> print "SSN: ", person.getSSN()
SSN: 111-12-1111
>>>
Toto je situace, kdy víme kterou konkrétní instanci
požadujeme. Pokud však potřebujeme pracovat s kolekcí
instancí, jejichž množinu můžeme vyjádřit efektivně
SQL dotazem, můžeme postupovat následujícím způsobem:
>>> sql ="SELECT ID, Name, SSN FROM JCP.Person WHERE Name %STARTSWITH ?"
>>>
>>> cq = CacheQuery(dbconnection, sql)
>>>
>>> selectionCond = "B"
>>>
>>> rs = cq.execute(selectionCond)
>>>
>>> rs.next()
1
>>> rs.getMetaData().getColumnCount()
3
>>>
>>> rs.getString(1)
'14'
>>> rs.getString(2)
'Bach,Mark
Q.'
>>> rs.getString(3)
'805-84-9703'
>>>
>>>
>>> rs.next()
0
>>>
V případě modulu pak výsledek může vypadat
například takto:
C:\Home\Java\CP>jython CPTest06.py
Conected.
Creating resultset with dynamic query.
SQL: SELECT ID, Name, SSN FROM JCP.Person WHERE Name %STARTSWITH ?
Enter chars: B
Selected instances:
14: Bach,Mark Q.: 805-84-9703
# of instances: 1