Question

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 tel: Utilisateur:

@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; 
} 

Je suis en train de récupérer, puis détacher l'ensemble graphique d'objets. je peut voir dans le débogueur qu'il se charge très bien, mais quand j'arrive à détacher, je ne peux pas faire quoi que ce soit au-delà de la charge de l'objet utilisateur. (Non Les ponts, pas de cartes). Au début, j'essayé sans une transaction simplement « Toucher » tous les champs de l'objet attaché avant de détacher, mais cela n'a pas aidé. Ensuite, j'ai essayé d'ajouter tout à la valeur par défaut chercher groupe, mais que vient de générer des avertissements sur GAE ne supportant pas jointures. J'ai essayé la mise à -1, la profondeur de chercher un plan, mais aller chercher max qui ne le faisaient pas. 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 ...

Était-ce utile?

La solution

Je lis que du journal (niveau de débogage) vous dira de façon plus, car il vous dit certainement quand il est des choses détachait. Peut-être GAE / J ne respecte pas le chargement paresseux à Détacher? DataNucleus lui-même fonctionne très bien, avec tous les autres magasins de données.

Pourquoi faire appel FetchPlan.setGroup () lorsque que tous les groupes existants écrase? AddGroup () est plus logique pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top