2010-05-03 6 views
5

Je suis complètement à la fois à la fois JDO et GAE, et j'ai eu du mal à faire en sorte que ma couche de données persiste tout le code!Impossible de persister les objets dans GAE JDO

Les problèmes auxquels je suis confronté peuvent être très simples, mais je ne peux pas trouver un moyen, peu importe la solution que j'essaie.

Tout d'abord le problème: (Un peu simplifié, mais contient encore toutes les informations nécessaires) Mon modèle de données est en tant que tel:

User: 
    (primary key) 
    String emailID 
    String firstName 

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

Ce fut le datamodel initial. J'ai implémenté un objet CarPK pour obtenir une clé primaire composite de l'utilisateur et l'enregistrement. Cependant, cela a rencontré une variété de problèmes. (Que je délivrerai pour une autre fois/question)

J'ai ensuite changé la conception en tant que tel: utilisateur: (sans modification)

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

Cela fonctionne très bien pour l'utilisateur, et il est possible d'insérer et de retrouver l'utilisateur objets. Cependant, lorsque je tente d'insérer un objet de voiture, je reçois l'erreur suivante:

"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 

Je suis allé sur le lien, il a suggéré, qui explique comment créer des clés, mais ils continuent à parler de « groupes d'entités » et « Groupe Entité Parents". Mais je ne peux pas sembler trouver des articles ou des sites qui expliquent ce que sont "Entity Group" ou un "Entity Group Parents"

Je pourrais essayer de bidouiller un peu plus pour savoir si je peux stocker un objet en quelque sorte, Mais je Je cours un peu sur la patience et je préférerais plutôt comprendre et mettre en œuvre que vice versa. Donc, j'apprécierais tous les docs (même si c'est énorme) qui couvre tous ces points, et a de préférence quelques exemples qui vont au-delà de la modélisation de données très basique.

Et merci pour la lecture d'un tel poste à long :)

+1

Veuillez inclure votre code. – Finbarr

Répondre

13

Je crains que vous ne serez pas comme la réponse. GAE JDO doit être utilisé d'une manière très spécifique et est lourd de limitations que vous devez observer pour l'utiliser efficacement. Lisez les documents en avant et en arrière. Pour la question que vous voyez maintenant, vous avez probablement besoin de lire cette section deux ou trois fois:

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

GAE JDO a propriété et unowned relations. Voir la documentation ci-dessus pour des exemples de appartenant vs sans propriétaire. Je crois que vous voulez Car et User pour avoir une relation . Notez cette révélation dans la documentation de Google App Engine sur les relations unowned:

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.

Cela signifie essentiellement, d'utiliser GAE JDO, vous ne devriez pas utiliser une référence directe pour une relation unowned comme entre le Car et classes d'utilisateurs.Vous devez plutôt utiliser des références indirectes entre eux, c'est-à-dire que Car doit avoir un champ pour la clé de l'utilisateur plutôt qu'une référence directe à l'utilisateur lui-même. Certains des problèmes que vous rencontrez sont dus au fait que GAE JDO ne peut pas gérer la façon dont vous modélisez cette relation dans le code.

Asker poursuit en disant:

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é Groupe-a graph of objects that were initially persisted together. Par exemple, parce que Car fait directement référence à un utilisateur, lorsque vous persistez une instance Car donnée pour la première fois, vous perdez également l'instance utilisateur à laquelle il fait référence et cette instance Car et cette instance utilisateur font partie de la même entité groupe. Si cette instance de l'utilisateur a déjà été conservée, soit de manière indépendante par elle-même ou dans le cadre d'une autre instance de Car, cette instance de l'utilisateur se trouve déjà dans un autre groupe d'entités. Les relations «possédées» sont supposées appartenir au même groupe d'entités. Notez que les transactions GAE JDO ne peuvent modifier qu'un seul groupe d'entités.

Entité Groupe Parent - a top-level/root ("parent") persisted clas s. Dans l'exemple ci-dessus, lorsque vous persistez une instance Car donnée pour la première fois, vous devez également persister l'instance utilisateur à laquelle il se réfère. L'instance Car est le parent du groupe d'entités. Une classe "enfant" "enfant" comme l'utilisateur incorpore la clé de son parent (Car) dans sa propre clé (Utilisateur). Si vous deviez extraire une instance Car de la base de données puis tenter d'accéder à l'utilisateur auquel cette voiture fait référence, le JDO GAE utilisera la clé de la voiture pour trouver l'utilisateur correspondant (car la clé de l'utilisateur cible a la clé dans le cadre de sa propre clé).

Asker a ce message d'erreur:

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

Remarque 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.

Cela signifie que les classes "enfants" doivent utiliser certain types of keys (c.-clés qui sont capables d'encapsuler la clé de leurs parents dans la clé de l'enfant). Long et String conviennent à classes de groupes d'entités classes, c'est-à-dire classes non-enfants. Cependant, les classes "enfant" doivent utiliser le type Key ou Key encoded as String pour leur clé. Le message d'erreur indique que la classe Car fait référence à la classe User comme s'il s'agissait d'une classe «enfant» «appartenant» et que la classe User doit utiliser un type de clé approprié pour un enfant, mais la classe User n'utilise pas de clé type approprié pour un enfant (chaîne non codée).

Le correctif pour le problème immédiat à la main est de modèle de voiture et l'utilisateur d'être un unowned relation en changeant de voiture d'avoir la référence directe à l'utilisateur d'avoir à la place d'une référence indirecte en stockant la clé de l'utilisateur associée. Le correctif global inclura probablement un examen approfondi de la façon d'adapter votre modèle d'objet au cadre de GAE JDO (une fois que vous aurez parcouru les docs pour essayer de le comprendre). Cela inclura probablement de devoir gérer manuellement certaines des relations entre les classes.

Si c'est une consolation, je suis confronté au même genre de problèmes avec GAE JDO moi-même (j'ai même une classe Car aussi!).

+0

Tout d'abord Merci d'avoir pris le temps de fournir une réponse aussi détaillée !!! Très apprécié ... J'avais d'abord essayé de modéliser des relations de propriété mais cela ne fonctionnait pas en raison de divers problèmes avec la clé.Comme je manque de temps et que ce projet ne va pas trop sur le modèle DB, j'ai décidé d'aller avec les références indirectes. Je reviendrai à l'expérimentation pour mon prochain projet. –

+0

@Basil - Je pense que vous vouliez une relation "sans propriétaire", mais vous avez codé une relation "possédée" (en utilisant des références directes). Comme indiqué dans cette réponse, le recours à des références indirectes est la solution valable - pas besoin de "tester" davantage. –

+0

En fait, dès le départ, je voulais une relation propriétaire. J'avais même fait les objets PK pour représenter l'enregistrement Utilisateur et Voiture en tant que clé. Cependant, cela n'a pas fonctionné, avec des problèmes encore plus confus. Pour l'instant, la solution est acceptable, mais j'étais toujours intéressé à apprendre la bonne façon de le faire aussi bien. Parce que le correctif actuel traite Big Table comme un SGBDR. –