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