2010-03-08 3 views
2

Je suis en train de charger le plein objet graphique pour l'utilisateur, qui contient une collection de ponts, qui contient alors une collection de cartes, comme tels: utilisateur:problème détachant tout le graphe d'objet dans GAE-J avec JDO

@PersistenceCapable(detachable = "true") 
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE) 
@FetchGroup(name = "decks", members = { @Persistent(name = 
"_Decks") }) 
public abstract class User { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    protected Key _ID; 
    @Persistent 
    protected String _UniqueIdentifier; 
    @Persistent(mappedBy = "_Owner") 
    @Element(dependent = "true") 
    protected Set<Deck> _Decks; 
     protected User() 
    { 
    } 
} 

chaque plate-forme a une collection de cartes, en tant que tel:

@PersistenceCapable(detachable = "true") 
@FetchGroup(name = "cards", members = { @Persistent(name = 
"_Cards") }) 
public class Deck { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key _ID; 
    @Persistent 
    String _Name; 
    @Persistent(mappedBy = "_Parent") 
    @Element(dependent = "true") 
     private Set<Card> _Cards = new HashSet<Card>(); 
    @Persistent 
     private Set<String> _Tags = new HashSet<String>(); 
    @Persistent 
    private User _Owner; 
} 

Et enfin, chaque carte:

@PersistenceCapable 
public class Card { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key _ID; 
    @Persistent 
    private Text _Question; 
    @Persistent 
    private Text _Answer; 
    @Persistent 
    private Deck _Parent; 
} 

J'essaye de récupérer puis de détacher tout le graphe d'objet. Je peut voir dans le débogueur qu'il se charge bien, mais quand je deviens à se détacher, je ne peux rien faire au-delà de la charge de l'objet Utilisateur. (No Decks, pas de cartes). Au début, je ai essayé sans transaction pour simplement "toucher" tous les champs sur l'objet ci-joint avant de se détacher, mais qui n'a pas aidé. Ensuite, j'ai essayé d'ajouter tout au groupe par défaut , mais cela a juste généré des avertissements à propos de GAE ne supportant pas les jointures . J'ai essayé de définir la profondeur de fetch max du plan de fetch à -1, mais qui ne l'a pas fait. Enfin, j'ai essayé d'utiliser FetchGroups comme vous pouvez le voir ci-dessus , puis récupérer le code suivant:

PersistenceManager pm = _pmf.getPersistenceManager(); 
       pm.setDetachAllOnCommit(true); 
       pm.getFetchPlan().setGroup("decks"); 
       pm.getFetchPlan().setGroup("cards"); 
       Transaction tx = pm.currentTransaction(); 
       Query query = null; 
      try { 
       tx.begin(); 
         query = pm.newQuery(GoogleAccountsUser.class); //Subclass of User 
         query.setFilter("_UniqueIdentifier == TheUser"); 
         query.declareParameters("String TheUser"); 
         List<User> results = (List<User>)query.execute(ID); //ID = Supplied 
parameter 
         //TODO: Test for more than one result and throw 
         if(results.size() == 0) 
         { 
           tx.commit(); 
           return null; 
         } 
         else 
         { 
           User usr = (User)results.get(0); 
           //usr = pm.detachCopy(usr); 
           tx.commit(); 
           return usr; 
         } 
      } finally { 
       query.closeAll(); 
        if (tx.isActive()) 
        { 
         tx.rollback(); 
        } 
       pm.close(); 
      } 

Cela ne fonctionne pas non plus, et je suis à court d'idées ...

Répondre

1

Je suis sûr que la lecture du journal (niveau de débogage) vous en dira plus, car elle vous indique quand il détache des choses. Peut-être que GAE/J ne respecte pas le chargement paresseux à detach? DataNucleus fonctionne correctement, avec tous les autres magasins de données.

Pourquoi appeler FetchPlan.setGroup() lorsque cela écrase tous les groupes existants? addGroup() a plus de sens pour moi.

+0

La modification de setGroup() pour ajouterGroup() l'a totalement corrigé. Je vous remercie! Incroyable comment je peux avoir presque tout bien et qu'une petite erreur m'a coûté des jours ... Je suppose que c'est ce qui arrive à être nouveau dans un cadre complexe. – tempy

Questions connexes