2009-09-30 18 views
3

J'utilise le moteur d'application Goole datastore avec Java et en essayant de charger un objet avec une liste des énumérations. Chaque fois que je charge l'objet, la liste est nulle. L'objet estune collection de Enums avec le moteur Google app datastore

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class ObjectToSave { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private List<AnEnum> anEnumList; 

    //public getters and setters 
} 

ENUM est simple

public enum AnEnum { 
    VALUE_1, 
    VALUE_2; 
} 

Le code pour l'enregistrer est

ObjectToSave objectToSave = new ObjectToSave(); 
List<AnEnum> anEnumList = new ArrayList<AnEnum>(); 
anEnumList.add(AnEnum.VALUE_1); 
objectToSave.setAnEnumList(anEnumList); 
PersistenceManager pm = pmfInstance.getPersistenceManager(); 
try { 
    pm.makePersistent(objectToSave); 
} finally { 
    pm.close(); 
} 

Le code pour le charger est

PersistenceManager pm = pmfInstance.getPersistenceManager(); 
try { 
    Key key = KeyFactory.createKey(ObjectToSave.class.getSimpleName(), id); 
    ObjectToSave objectToSave = pm.getObjectById(ObjectToSave.class, key); 
} finally { 
    pm.close(); 
} 

je peux voir les données dans le magasin de données en utilisant http://localhost:8080/_ah/admin et peut voir ma liste a été enregistrée, mais il n'est pas là lorsque l'objet est chargé.

J'ai créé mon projet avec le plugin Eclipse et je n'ai pas modifié les paramètres du magasin de données pour autant que je sache. Alors pourquoi id ma liste Enum null?

+1

Pouvez-vous montrer le code où vous attribuez la liste à anEnumList? – Yishai

+0

Les autres champs de l'objet sont-ils correctement enregistrés? –

+0

J'ai mis à jour la question pour montrer la création de la liste enum. D'autres valeurs que je n'ai pas ajoutées ici sont en cours d'enregistrement et la clé primaire est en cours de définition. – Chris

Répondre

5

Oui, mais votre champ de liste ne sont pas dans le groupe de récupération par défaut lors du chargement alors par conséquent n'est pas chargé. Lire JDO Fetch Groups. Vous pouvez l'ajouter au DFG, ou activer un groupe de récupération personnalisé, ou simplement "toucher" le champ avant de fermer le MP.

--Andy (DataNucleus)

1

Comment créez-vous une instance de ObjectToSave? La valeur par défaut de tous les types de référence de variable d'instance est null, donc à moins que vous ayez du code (supplémentaire) pour créer une instance de List<AnEnum> et l'affecter à anEnumList, null serait attendu.

+0

Je mets une valeur à la liste avec un débogueur que je peux voir avant de sauvegarder l'objet. J'ai mis à jour la question pour essayer de la clarifier. – Chris

+0

Peut-être que vous devez marquer votre déclaration enum comme @PersistenceCapable? –

+0

"Une collection d'objets enfants (de classes @PersistenceCapable) crée plusieurs entités avec une relation un-à-plusieurs. De: http://code.google.com/appengine/docs/java/datastore/dataclasses.html#Collections –

Questions connexes