Zellbiologie: GWT CellTable

Produzent – Service

Was noch fehlt, ist die Implementierung des Service. Hier ist es nützlich, dass sich die Parameter der Service-Methode – der Index des ersten zu liefernden Songs sowie die Anzahl der Ergebnisse – direkt an eine JPA-Anfrage weitergeben lassen. Der Service braucht also lediglich einen JPA EntityManager zu erzeugen, von diesem ein Query-Objekt anzufordern und dieses mit den entsprechenden Parametern auszuführen (Listing 6). Zu Details der JPA-Implementierung finden sich im Kasten „JPA und GAE“ einige Anmerkungen.

Listing 6
public class SongSearchServiceImpl extends RemoteServiceServlet implements
SongSearchService {
public SongSearchResult searchSongs(int startIdx, int count) {
EntityManager em = createEM(); // use utility method
@SuppressWarnings("unchecked")
List songs = em.createQuery("select s from SongInfo s")
.setFirstResult(startIdx).setMaxResults(count).getResultist();
return songs;
}
}
JPA und GAE

Die Persistenz-Implementierung der Google App Engine basiert nicht auf einer relationalen Datenbank, sondern auf Googles hoch-skalierender BigTable. Dies bringt für Kenner klassischer Datenbanken einige überraschende und zum Teil auch schmerzhafte Einschränkungen mit sich, die in [2] gut beschrieben wurden. Für den hier dargestellten vereinfachten Anwendungsfall wirkt sich dieser Sachbestand eher weniger aus.

Die Nutzung von JPA in der App Engine ist in [5] erklärt; die Beispielanwendung hält sich an die dort aufgeführten Muster. Da hier auch nur eine Tabelle für die Songs zum Einsatz kommt, gibt es bei den Entity-Klassen keine Besonderheiten. Es ist sogar möglich, die Entity-Objekte direkt an den Client zu übergeben und dort in der CellTable anzuzeigen.

Wird das Datenmodell komplexer, kann es passieren, dass technische Details der GAE Persistenz-Auswirkungen auf die Entity-Klassen haben. Zum Beispiel kann es erforderlich sein, beim Einsatz von 1:n-Relationen spezielle Primärschlüssel zu verwenden. In diesem Fall funktioniert die direkte Übertragung der Entity-Objekte zu einem GWT-Client nicht mehr ohne Weiteres, da die speziellen GAE-Klassen auf der Client-Seite nicht vorhanden sind. Man kommt dann um eine Konvertierung zu spezifischen Datenobjekten nicht herum.

Evolution

Bisher haben wir den Einsatz einer CellTable-Komponente zur Darstellung von Daten beschrieben, die über einen JPA-basierten Service geladen wurden. Die Strategie bestand im Wesentlichen darin, die von der Tabelle gelieferten Eckdaten über den sichtbaren Bereich in Parameter umzusetzen, die die Ausführung von JPA-Abfragen direkt beeinflussen.

Eine naheliegende Erweiterung ist die Unterstützung von Sortierfunktionen: Einzelne Spalten der Tabelle können als sortierbar gekennzeichnet werden. Die CellTable führt dann automatisch Buch über Klicks des Benutzers auf Spaltentitel und ermittelt auf diese Weise eine Sortierordnung. Diese Information lässt sich an den Service weitergeben, wo sie zur Generierung einer ORDER-BY-Klausel genutzt werden kann.

Ich hoffe, mit diesem Artikel die Neugier an der Species Cell Widget geweckt zu haben. Zwecks weiterführender Studien findet sich unter [6] ein experimentelles Projekt, das im Untermodul server eine GWT-Anwendung zur Verwaltung einer Musik-Sammlung mit einem etwas komplexeren Datenmodell enthält. Die hier beschriebenen Konzepte sind in diesem Projekt implementiert.

Oliver Heger arbeitet als Software-Entwickler und Architekt bei der Agfa HealthCare AG im Bereich Clinical Research Solutions.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.