2009-04-14 3 views
17

Ich möchte eine Web-App erfordert Datenpersistenz mit GWT und GAE entwickeln. Wie ich es verstehe, ist meine einzige (oder zumindest bei weitem die bequemste) Option für die Datenpersistenz der Datenspeicher von GAE, der mit JO- oder JPA-Annotationen versehene Objekte verwendet. Ich möchte auch in der Lage sein, meine Objekte Client-Server mit GWT Remote Procedure Calls (RPC) hin und her senden, daher müssen meine Objekte in der Lage sein, "zu trennen". Die GWT-RPC-Serialisierung kann jedoch nicht mit getrennten JDO/JPA-Objekten umgehen, und es scheint nicht so, als ob sie in naher Zukunft erscheint.Google Web Toolkit (GWT) + Google App Engine (GAE) + Frei stehend Datenpersistenz

Meine Frage: Was ist die einfachste und direkteste Lösung dafür? Die Möglichkeit, die gleichen Objekte Client/Server mit serverseitiger Persistenz zu teilen, wäre äußerst praktisch.

EDIT

ich klarstellen sollte, dass ich noch GWT RPC mit GAE-Datenspeicher verwenden möchten. Ich bin nur auf der Suche nach der besten Lösung, die es all diesen Technologien ermöglicht, zusammenzuarbeiten.

+0

+1 finden, um einen webbasierten Cluster-Dienst für lokale Datenpersistenz zu verwenden. :-) –

+1

Würden Sie darüber nachdenken, Ihren Fortschritt zu teilen, nachdem Sie hier Antworten erhalten haben? (und bitte erwägen Sie, die beste Antwort zu wählen) –

Antwort

0

da letztlich GWT zu JavaScript kompiliert, für freistehende Beharrlichkeit wäre es eines der wenigen Dienstleistungen benötigen. Die bekanntesten sind HTML5-Speicher und Gears (beide verwenden SQLite!). Natürlich ist keiner von beiden weit verbreitet, Sie müssen also Ihre Benutzer davon überzeugen, entweder einen modernen Browser zu verwenden oder ein wenig bekanntes Plugin zu installieren. sicher sein, zu einer nutzbaren Teilmenge verschlechtern, wenn der Benutzer nicht

+0

Durch detached sprechen sie über das Senden von Hibernate usw. verbesserte dtos nicht Persistenz im Browser. –

+0

typischer Fall von Begriffen Kollision. – Javier

3

nicht erfüllt eine Weile her, schreibe ich einen Beitrag Using an ORM or plain SQL?

Die letzte Jahr in einer GWT Anwendung kam ich schreibe. Viele Übersetzung von EclipseLink zu Präsentationsobjekte im Service Umsetzung. Wenn wir ibatis wurden unter Verwendung wäre es viel einfacher zu waren die entsprechenden Objekte mit ibatis erstellen und dann geben sie den ganzen Weg nach oben und unten im Stapel. Einige Puristen könnten argumentieren, dass dies Bad ™ ist. Vielleicht so (in Theorie), aber ich sage Ihnen was: es zu einfacherem Code geführt habe, eine einfachen Stapel und mehr Produktivität.

was im Grunde Ihre Beobachtung entspricht.

Aber das ist natürlich keine Option mit Google App Engine ist so bist du ziemlich viel eine Übersetzungsschicht zwischen clientseitigen Objekten und Ihren JPA-Entitäten stecken zu müssen.

JPA-Entitäten sind recht starr, so dass sie nicht wirklich geeignet für sowieso hin und her zwischen dem Client sendet. In der Regel möchten Sie dabei kleine Bits aus mehreren Entitäten (und damit eine Art Präsentationslayer-Wertobjekt). Das ist dein Weg nach vorn.

2

Sie können JSON verwenden. GWT verfügt über die erforderliche API, um & JSON-Zeichenfolge auf der Clientseite zu analysieren. Sie erhalten eine Menge JSON API für die Serverseite. Ich habe es mit Google-Gson versucht, was in Ordnung ist. Es konvertiert Ihre JSON-Zeichenfolge in POJO-Modell und umgekehrt.

7

Ausprobieren Verwenden http://gilead.sourceforge.net/

+0

Genauer gesagt die Adapter4AppEngine http://noon.gilead.free.fr/gilead/index.php?page=adapter4appengine Nur beachten Sie, dass nicht alle Google JDO-Typen serialisieren werden. Text, Blob und Benutzer zum Beispiel. Du wirst es auf andere Weise noch schaffen müssen. – Drew

5

Ray Cromwell hat eine temporary hack up Hoffe, das hilft Ihnen, eine anständige Lösung für Ihre Anforderung bereitstellt. Ich habe es versucht, und es funktioniert.

Es zwingt Sie, Transient anstelle von abnehmbaren Entitäten zu verwenden, da GWT ein verstecktes Objekt [], das von DataNucleus verwendet wird, nicht serialisieren kann; Dies bedeutet, dass die Objekte, die Sie an den Client senden, nicht wieder in den Datenspeicher eingefügt werden können. Sie müssen das tatsächliche Datenspeicherobjekt abrufen und alle persistenten Felder wieder in den Datenspeicher kopieren. Die Methode von Ray verwendet Reflektion, um über die Methoden zu iterieren, ruft die Methoden getBean() und setBean() auf und wendet das Entity setBean() auf das getBean() Ihres transienten gwt-Objekts an.

Sie sollten sich bemühen, JDO zu verwenden, die JPA ist nicht viel mehr als eine Wrapper-Klasse für jetzt. Um diesen Hack verwenden zu können, müssen Sie sowohl Getter- als auch Setter-Methoden für jedes persistente Feld verwenden, wobei für jedes "Bean" -Feld die PROPER-Syntax getBean und setBean verwendet wird. Nun, FAST PROPER, da es annimmt, dass alle Getter mit "get" beginnen, wenn das boolesche Standardfeld "is" ist.

Ich habe dieses Problem behoben und einen Kommentar zu Ray's Blog geschrieben, aber es wartet auf die Genehmigung und ich bin mir nicht sicher, ob er es veröffentlichen wird. Im Wesentlichen habe ich eine @GetterPrefix (prefix = MethodPrefix.IS) -Anmerkung im Paket org.datanucleus implementiert, um seine Arbeit zu erweitern.

Falls es nicht gepostet wird, und dies ein Problem ist, mailen Sie x_AT_aiyx_DOT_info Re: @GetterPrefix für JDO und ich werde Ihnen das Update senden.

3

Try this. Es ist ein Modul zum Serialisieren von GAE-Kerntypen und zum Senden an den GWT-Client.

2

Derzeit verwende ich das DTO (DataTransferObject) -Muster. Nicht unbedingt so sauber und viel mehr Boilerplate, aber GAE erfordert immer noch eine beträchtliche Menge an Standard bei Strom. ;)

Ich habe ein Domain-Objekt (normalerweise) Eins-zu-eins mit einem DTO zugeordnet. Wenn ein Client Domäneninformationen benötigt, hustet ein DAO (DataAccessObject) eine DTO-Repräsentation des Domänenobjekts und sendet diese über die Leitung. Wenn ein DTO zurückkommt, gebe ich dem DAO den DTO, der dann alle geeigneten Domain-Objekte aktualisiert.

Nicht so sauber wie Domain-Objekte direkt über die Leitung übergeben zu können, aber die Einschränkungen der JDO-Implementierung von GAE und des Serialisierungsprozesses von GWT bedeutet, dass dies der sauberste Weg für mich ist.

0

Wie wäre es direkt zu verwenden, um POJO-Domain-Objekte zu laden/zu speichern?

Es sollte mit DTO-Ansatz vergleichbar sein, was bedeutet z. dass Sie alle Felder manuell bearbeiten müssen (wenn Sie keine Tricks wie die reflektionsbasierte Automatisierung verwenden), während Sie mehr Flexibilität und vollständigen Zugriff auf alle Datastore-Funktionen erhalten sollten.

5

Ich habe kürzlich Objectify gefunden, die als Ersatz für JDO entwickelt wurde. Noch nicht viel Erfahrung damit, aber einfacher zu benutzen als JDO, scheint leichter und behauptet, die Notwendigkeit für DTOs mit GWT zu umgehen, obwohl ich diese spezielle Funktion noch nicht ausprobiert habe.

1

Ich habe auch Objectify verwendet, und ich mag es wirklich. Sie müssen immer noch mit pre/postLoad-Methoden tanzen, um z. Text zu String und zurück.

2

Ich glaube, die offizielle Antwort von Google dafür ist GWT 2.1 RequestFactory. Angesichts der Tatsache, dass Sie GWT und GAE verwenden, würde ich vorschlagen, dass Sie sich an das offizielle Google-Framework halten ... Ich habe eine ähnliche GWT/GAE-basierte App und das ist, was ich tue.

Übrigens, die Einrichtung von RequestFactory ist ein bisschen Schmerz in den Arsch.Das aktuelle Eclipse-Plug-In enthält nicht alle Jars, aber ich konnte die benötigte Hilfe in Stackoverflow