2009-12-24 5 views
2

ont une classe:JDO pas aller chercher champ membre de la collection

class Node implements Serializable 
{ 
    private String name; 

    public String getName { return name; } 
    public void setName(String val){ name = val; } 

    public Node(){} 
} 

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true") 
class NodeBag implements Serializable 
{ 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    Long id; 

    @Persistent(serialized="true") 
    private ArrayList<Node> nodes = new ArrayList<Node>(); 

    public String getNodes { return nodes; } 
    public void setNodes(ArrayList<Node> val){ nodes = val; } 

    public NodeBag(){} 
} 

je peux l'enregistrer dans la db avec ce

PersistenceManager pm = PMF.getManager(); 
try 
{ 
pm.makePersistent(newBag); 
} 
finally 
{ 
pm.close(); 
} 

Mais quand je le charge retour

PersistenceManager pm = PMF.getManager(); 
Query q = pm.newQuery(NodeBag.class); 
try 
{ 
List<NodeBag> pipelines = (List<NodeBag>)q.execute(); 
return nodeBags; // nodeBags[0].nodes is always empty 
} 
finally 
{ 
q.closeAll(); 
} 

Nodebag .nodes est toujours vide!

Ai-je raté quelque chose?

Merci d'avance.

Cordialement, Paul

Répondre

0

Vous avez manqué de le mettre dans le plan chercher? marquez dans le groupe de recherche par défaut peut-être, ou accédez au champ, ou mettez dans un plan d'extraction personnalisé, selon les documents DataNucleus et JDO spec.

0

En fait, je voulais aussi renvoyer la réponse à travers le fil en le convertissant en JSON. Et j'ai réussi à charger les objets enfants. L'astuce que j'utilise est détachée. En se détachant, tout sera chargé.

Merci.

1

Dans votre appel pour renvoyer les objets, vous pouvez utiliser FetchPlan pour spécifier quel FetchGroup doit renvoyer. Voir JDO docs pour plus d'informations sur les options FetchGroup.

Vous pouvez vous assurer que toutes les entités sont récupérées, en spécifiant dans votre PersistenceManager le FetchGroup à utiliser. Le code modifié est illustré ci-dessous:

PersistenceManager pm = PMF.getManager(); 
pm.getFetchPlan().setGroup(FetchGroup.ALL); 
Query q = pm.newQuery(NodeBag.class); 
try { 
    List<NodeBag> pipelines = (List<NodeBag>)q.execute(); 
    return nodeBags; // nodeBags[0].nodes is always empty 
} finally { 
    q.closeAll(); 
} 
1

J'ai eu le temps d'obtenir des groupes de récupération pour travailler. Les deux Query et PersistenceManager ont un getFetchPlan(), mais seulement celui sur PersistenceManager semble fonctionner.

De même, assurez-vous de rendre vos objets détachables et utilisez le pm.detachCopyAll() sur le résultat.

+0

+1 travail effectuée après que j'ai appelé pm.detachCopy (T) Merci :) – naikus

0

Utilisation Collection insted de la liste et il devrait commencer à travailler aussi longtemps qu'il est dans une transaction

Questions connexes