Finally fixed after a tip from DataNucleus over on stackoverflow...

                pm.getFetchPlan().setGroup("decks");
                pm.getFetchPlan().setGroup("cards");
should actually be
                pm.getFetchPlan().addGroup("decks");
                pm.getFetchPlan().addGroup("cards");

The setgroup methods overwrite whatever groups are already there, and
the addgroup methods just add them.  Lesson learned the hard way.

On Mar 9, 12:07 am, tempy <[email protected]> wrote:
> All sorts of permutations have still failed to do this for me.  From
> searching this group and stackoverflow, I'm starting to wonder if many
> people actually use JDO attach/detach in any significant way.
> Anyone??
>
> On Mar 8, 12:29 am, tempy <[email protected]> wrote:
>
>
>
> > I am trying to load the full object graph for User, which contains a
> > collection of decks, which then contains a collection of cards, as
> > such:
>
> > User:
> > @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()
> >     {
> >     }
>
> > }
>
> > Each Deck has a collection of Cards, as such:
> > @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;
>
> > }
>
> > And finally, each card:
> > @PersistenceCapable
> > public class Card {
> >     @PrimaryKey
> >     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
> >     private Key _ID;
> >   �...@persistent
> >     private Text _Question;
> >     @Persistent
> >     private Text _Answer;
> >     @Persistent
> >     private Deck _Parent;
>
> > }
>
> > I am trying to retrieve and then detach the entire object graph.  I
> > can see in the debugger that it loads fine, but then when I get to
> > detaching, I can't make anything beyond the User object load.  (No
> > Decks, no Cards).  At first I tried without a transaction to simply
> > "touch" all the fields on the attached object before detaching, but
> > that didn't help.  Then I tried adding everything to the default fetch
> > group, but that just generated warnings about GAE not supporting
> > joins.  I tried setting the fetch plan's max fetch depth to -1, but
> > that didn't do it.  Finally, I tried using FetchGroups as you can see
> > above, and then retrieving with the following code:
>
> >                 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();
> >             }
>
> > This also doesn't work, and I'm running out of ideas.  I'm new to GAE/
> > JDO, so go easy please. =)
>
> > Thanks,
> > Mike

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to