2011. október 7., péntek

JDO és az öröklődés

Az AppEngine egyik erőssége a JDO támogatás. A valós kilométer projekt kapcsán 3 alap osztályon keresztül mutatom be hogyan használható a JDO: AppUser, Vehicle és Issue. A bejelentkezett felhasználó adatait az AppUser, az ő járműveit a Vehicle, és a járművekhez tartozó bejegyzéseket az Issue tartalmazza.

Az adatszerkezet kialakításánál kihasználom az öröklődést és az annotációkkal megvalósítható egy-több kapcsolatot. Ennek részletei az AppEngine JDO oldalán és néhány az öröklődést bemutató oldalon részletesen megtalálhatóak.

Források:
Creating, Getting and Deleting Data in JDO
Google App Engine for Java, Part 3: Persistence and relationships
Google App Engine + JAVA + JDO + Inheritance + One-To-Many Relationships
Unindexed Properties

Mivel a további leírásokhoz kódrészletek is tartoznak, így a Google Code oldalán létrehoztam egy fiókot, ahonnan letölthető a folyamatosan bővített forráskód. A kód eléréséhez érdemes telepíteni az Eclipse-hez a Subclipse plugint, így kicsekkolhatjuk és folyamatosan frissíthetjük a kódot.

Az eddigi egyszerű OpenId belépési rendszert bővítettem tovább, így a http://valoskmdev.appspot.com/valoskmdev oldalon, belépés után a felhasználóhoz feltöltött mock adatokat láthatjuk listázva:


Az adatok létrehozása után a helyi gépen létrejön a "\WEB-INF\appengine-generated" könyvtár és benne két fájl. Az egyik az adatokat tartalmazza (local_db.bin), a másik az automatikusan létrehozott indexeket (datastore-indexes-auto.xml).


 \WEB-INF\appengine-generated\datastore-indexes-auto.xml
<!-- Indices written at Thu, 6 Oct 2011 18:57:53 UTC -->

<datastore-indexes>

    <!-- Used 1 time in query history -->

    <datastore-index kind="AppUser" ancestor="false" source="auto">

        <property name="user" direction="asc"/>

        <property name="timeCreated" direction="asc"/>

    </datastore-index>

    <!-- Used 1 time in query history -->

    <datastore-index kind="Vehicle" ancestor="true" source="auto">

        <property name="timeCreated" direction="desc"/>

    </datastore-index>

    <!-- Used 1 time in query history -->

    <datastore-index kind="Issue" ancestor="true" source="auto">

        <property name="issues_INTEGER_IDX" direction="asc"/>

    </datastore-index>

</datastore-indexes>


Az automatikusan létrehozott indexek a fejlesztői környezetben és a fejlesztés kezdetekor jól használhatók, de éles környezetben érdemes saját, manuális beállításokat használni.

A bemutatóban használt kód nem szép, csak a JDO használatát mutatja. A teljes funkciónalításhoz kellenek controller szervletek, megjelenítő jsp lapok is. A statikus DAO-kat is érdemes Spring IoC-vel injektálva helyettesíteni. A bemutatott kód a JDO könnyebb érthetősége miatt ilyen egyszerű.


// JDO
PersistenceManager pm = null;
try {

	pm = PMF.get().getPersistenceManager();
	AppUser currentUser = UserDao.getUser(pm, user);
    	log.info("currentUser in DB: " + currentUser);
    	if (currentUser == null) {
    		currentUser = initDatabase(pm, user);
    	}
    	req.setAttribute("currentUser", "currentUser");
    	out.println("*******************************");
    	out.println("currentUser: " + currentUser);
    	for (Vehicle vehicle : currentUser.getVehicles()) {
    		out.println(" - vehicle: " + vehicle);
    		for (Issue issue : vehicle.getIssues()) {
        		out.println(" + issue: " + issue);
        	}
    	}

} finally {
    	if (pm != null) {
    		pm.close();
    	}
}


A példában látható, hogy elég a felhasználói adatokat betölteni, utána a kapcsolódó collection-öket már egy egyszerű getter-rel beolvashatjuk (lazy loading). A kód további részletei a code.google.com oldalon böngészhetők.

Nincsenek megjegyzések:

Megjegyzés küldése