2010-05-03 8 views
5

Ich bin völlig neu in JDO und GAE und habe Mühe, meine Datenschicht überhaupt mit Code zu versehen!Objekte können nicht in GAE gespeichert werden. JDO

Die Probleme, mit denen ich konfrontiert bin, mögen sehr einfach sein, aber ich kann einfach keinen Weg finden, egal welche Lösung ich versuche.

Zum einen das Problem: (Ein wenig vereinfacht, sondern enthält noch alle Informationen erforderlich) ist mein Datenmodell als solche:

User: 
    (primary key) 
    String emailID 
    String firstName 

Car: 
    (primary key) 
    User user 
    (primary key) 
    String registration 
    String model 

Dies ist die anfängliche Datenmodell war. Ich habe ein CarPK-Objekt implementiert, um einen zusammengesetzten Primärschlüssel des Benutzers und die Registrierung zu erhalten. Allerdings gab es eine Reihe von Problemen. (Die ich für eine andere Zeit/Frage speichern)

ich dann das Design als solche geändert: Benutzer: (unverändert)

Car: 
(primary key) 
String fauxPK (here fauxPK = user.getEmailID() + SEP + registration) 
User user 
String registration 
String model 

Dies funktioniert für den Benutzer gut, und es kann ein und Benutzer abrufen Objekte. Jedoch wenn ich versuche, ein Car-Objekt einfügen, erhalte ich folgende Fehlermeldung:

"Cannot have a java.lang.String primary key and be a child object" 

Found the following helpful link about it: 
http://stackoverflow.com/questions/2063467/persist-list-of-objects 

auf den Link Wir waren dort vorgeschlagen, die erklärt, wie Schlüssel erstellen, aber sie reden immer über „Entity Groups“ und „Entity-Gruppe Eltern". Aber ich kann nicht scheinen, irgendwelche Artikel oder Aufstellungsorte zu finden, die erklären, was "Entitäts-Gruppe" s oder eine "Entitäts-Gruppen-Eltern" ist

ich könnte versuchen, etwas herum zu rätseln, um herauszufinden, ob ich ein Objekt irgendwie speichern kann, aber ich Ich laufe nach Geduld und würde auch lieber verstehen und umsetzen als umgekehrt.

Also ich würde jede Dokumentation schätzen (auch wenn es riesig ist), die alle diese Punkte abdeckt, und hat vorzugsweise einige Beispiele, die über die grundlegende Datenmodellierung hinausgehen.

Und vielen Dank für das Lesen eines solchen langen Beitrag :)

+1

Bitte geben Sie Ihren Code ein. – Finbarr

Antwort

13

Ich fürchte, Sie die Antwort nicht mögen. GAE JDO muss auf sehr spezifische Weise verwendet werden und ist mit Einschränkungen behaftet, die Sie beachten müssen, um es effektiv zu nutzen. Lesen Sie die Dokumente vor und zurück. Für die Ausgabe, die Sie jetzt sehen werden, müssen Sie wahrscheinlich diesen Abschnitt ein paar Mal lesen:

http://code.google.com/appengine/docs/java/datastore/relationships.html

GAE JDO hat Besitz und unowned Beziehungen. Beispiele für im Besitz der vs unowned finden Sie in der Dokumentation oben. Ich glaube, Sie wollen Car und User eine besitzen Beziehung. Notieren Sie sich diese Offenbarung in der Google App Engine-Dokumentation über unowned Beziehungen:

http://code.google.com/appengine/docs/java/datastore/relationships.html#Unowned_Relationships

In addition to owned relationships, the JDO API also provides a facility for managing unowned relationships. The App Engine implementation of JDO does not yet implement this facility, but don't worry, you can still manage these relationships using Key values in place of instances (or Collections of instances) of your model objects.

Dies bedeutet im Wesentlichen, GAE JDO zu verwenden, können Sie keine direkte Referenz für eine unowned Beziehung wie zwischen dem verwendet werden soll Auto- und Benutzerklassen.Stattdessen sollten Sie indirekte Referenzen zwischen ihnen verwenden, d. H. Auto sollte ein Feld für den Schlüssel des Benutzers haben und nicht eine direkte Referenz auf den Benutzer selbst. Einige der Probleme, die Sie haben, sind, weil GAE JDO nicht damit umgehen kann, wie Sie diese Beziehung im Code modellieren.

Asker geht weiter:

Went to the link suggested there, that explains how to create Keys, however they keep talking about "Entity Groups" and "Entity Group Parents". But I cant seem to find any articles or sites that explain what are "Entity Group"s or an "Entity Group Parents"

Entitätsgruppe-a graph of objects that were initially persisted together. Da Car beispielsweise direkt auf einen Benutzer verweist, wenn Sie eine bestimmte Car-Instanz zum ersten Mal beibehalten, behalten Sie auch die Benutzerinstanz, auf die sie verweist, und diese Car-Instanz und diese Benutzerinstanz wären Teil derselben Entität Gruppe. Wenn diese Benutzerinstanz bereits entweder eigenständig oder als Teil einer anderen Car-Instanz persistent war, befindet sich diese Benutzerinstanz bereits in einer anderen Entitätsgruppe. "Eigene" Beziehungen sollen sich in derselben Entitätsgruppe befinden. Beachten Sie, dass GAE-JDO-Transaktionen nur eine Entitätsgruppe ändern können - weitere werden eine Ausnahme auslösen.

Einheit Gruppe Eltern - a top-level/root ("parent") persisted clas s. Im obigen Beispiel würden Sie, wenn Sie eine bestimmte Car-Instanz zum ersten Mal beibehalten, auch die Benutzerinstanz beibehalten, auf die sie sich bezieht. Die Car-Instanz ist der Entitätsgruppenträger. Eine "besessene" "Kind" -Klasse wie Benutzer bettet den Schlüssel ihres Elterns (Autos) in ihren eigenen (Benutzer) Schlüssel ein. Wenn Sie eine Car-Instanz aus der Datenbank ziehen und dann versuchen, auf den Benutzer zuzugreifen, auf den sich dieses Auto bezieht, sucht der GAE JDO den Autoschlüssel nach dem entsprechenden Benutzer (weil der Schlüssel des übergeordneten Benutzers den Schlüssel des übergeordneten Autos enthält) als Teil seines eigenen Schlüssels).

Asker bekam diese Fehlermeldung:

"Cannot have a java.lang.String primary key and be a child object"

Hinweis this statement in the docs:

The child class must have a key field whose type can contain the parent key information: either a Key, or a Key value encoded as a string. See Creating Data: Keys for information on key field types.

Das bedeutet, dass "Kind" Klassen certain types of keys (dh Schlüssel verwenden müssen, die ihre Eltern fähig sind der Schlüssel zum Einkapseln innerhalb des Kindes Schlüssel). Long und String sind geeignet für Entitätsgruppe Eltern Klassen, d.h. Nicht-Kind-Klassen. "Untergeordnete" Klassen müssen jedoch entweder Key oder Key encoded as String für ihren Schlüssel verwenden. Die Fehlermeldung weist darauf hin, dass die Klasse "Car" auf die Klasse "Benutzer" verweist, als ob sie eine eigene Klasse wäre. Daher muss die Klasse "Benutzer" einen für ein Kind geeigneten Schlüsseltyp verwenden, die Klasse "Benutzer" verwendet jedoch keinen Schlüssel Typ, der für ein Kind geeignet ist (nicht codierter String). Die Lösung für das unmittelbare Problem besteht darin, das Auto und den Benutzer als unverbundene-Beziehung zu modellieren, indem das Auto so geändert wird, dass es einen direkten Verweis auf den Benutzer hat und stattdessen einen indirekten Verweis erhält, indem der zugehörige Benutzerschlüssel gespeichert wird. Der allgemeine Fix wird wahrscheinlich beinhalten, dass Sie sich genau überlegen, wie Sie Ihr Objektmodell in GAE JDOs Framework einbauen können (wenn Sie einmal durch die Dokumente gegangen sind, um es zu verstehen). Dies wird wahrscheinlich beinhalten, dass einige der Beziehungen zwischen den Klassen manuell verwaltet werden müssen.

Wenn es einen Trost, ich habe mit der gleichen Art von Problemen mit GAE JDO selbst (ich habe sogar eine Auto-Klasse auch!).

+0

Erstens Danke, dass Sie sich die Zeit genommen haben, eine so detaillierte Antwort zu geben !!! Sehr geschätzt ... Ich hatte ursprünglich versucht, eigene Beziehungen zu modellieren, aber das funktionierte nicht wegen verschiedener Probleme mit dem Schlüssel.Da mir die Zeit zur Neige geht und dieses Projekt nicht zu sehr mit dem DB-Modell zu tun haben wird, habe ich mich für die indirekten Referenzen entschieden. Ich werde zu meinem nächsten Projekt zurückkehren. –

+0

@Basil - Ich glaube, du wolltest eine "nicht bekannte" Beziehung, aber du hast eine "eigene" Beziehung codiert (indem du direkte Referenzen benutzt). Wie in dieser Antwort angegeben, ist die Verwendung von indirekten Referenzen die gültige Lösung - es besteht keine Notwendigkeit, weiter zu "experimentieren". –

+0

Eigentlich von Anfang an wollte ich eine Owned Beziehung. Ich hatte sogar die PK-Objekte gemacht, um die Benutzer- und Auto-Registrierung als Schlüssel darzustellen. Aber das hat nicht funktioniert, mit noch mehr verwirrenden Problemen. Für jetzt ist die Lösung akzeptabel, aber ich war immer noch daran interessiert, den richtigen Weg zu erlernen. Weil das aktuelle Update Big Table wie ein RDBMS behandelt. –