Hello Mike,
have you tried touching them before you close the query?
I had similar problem and only solved it by calling the getter for the
owned collection before detaching the results.
if (results.iterator().hasNext()) {
for (Product fp : results) {
//this is to force the collections to be detached
fp.getItems();
}
return pm.detachCopyAll(results);
...
I found no better way to do that. I actually started managing
relationships by hand now because you have more control and more
performance especially if you do not always need the child
collections.
But maybe there is also a way to trigger that through an annotation.
Cheers,
Toby
On Mar 7, 1:46 am, tempy <[email protected]> wrote:
> I have the following 3-part owned relationship...
>
> Users, the root entity, have a collection of Decks, as such (I am not
> including the specific subclass of User as it doesn't seem to be
> relevant):
>
> @PersistenceCapable(identityType = IdentityType.APPLICATION)
> @Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
> public abstract class User {
> @PrimaryKey
> @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
> protected Key _ID;
>
> @Persistent
> protected String _UniqueIdentifier;
>
> @Persistent(defaultFetchGroup = "true", mappedBy = "_Owner")
> @Element(dependent = "true")
> protected Set<Deck> _Decks;
>
> protected KleioUser()
> {
> }
>
> }
>
> Each Deck has a collection of Cards, as such:
> @PersistenceCapable
> public class Deck {
> @PrimaryKey
> @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
> private Key _ID;
>
> @Persistent
> String _Name;
>
> @Persistent(defaultFetchGroup = "true", mappedBy = "_Parent")
> @Element(dependent = "true")
> private Set<Card> _Cards = new HashSet<Card>();
>
> @Persistent
> private Set<String> _Tags = new HashSet<String>();
>
> @Persistent
> private KleioUser _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've only run this on the dev server. When I create a new user and
> populate the corresponding decks and corresponding cards and then call
> pm.makepersistent(user), everything looks fine and I can see all the
> user, deck, and card entities in the development datastore. However,
> when I try to retrieve a user with the following query:
>
> Query query = _pm.newQuery(SpecificUser.class);
> query.setFilter("_UniqueIdentifier == TheUser");
> query.declareParameters("String TheUser");
>
> try {
> List<SpecificUser> results =
> (List<SpecificUser>)query.execute(ID);
>
> if(results.size() == 0)
> return null;
> else
> return results.get(0);
>
> } finally {
> query.closeAll();
> }
>
> I get the user just fine, and all the user's corresponding decks. But
> the decks have no cards. "Touching" the deck's cards collection with
> a .size() method doesn't load the cards, just returns 0, nor does
> setting the cards to the default fetch group. I also tried to set the
> pm's fetchplan to -1, but that didn't have the desired effect either.
>
> The weird thing is that if I persist the Deck without a parent user,
> then I will get the deck back, along with all its cards, with no
> problems.
>
> I've tried a lot of other things too and I'm starting to run low on
> ideas (and high on frustration), so any help would be appreciated.
>
> 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.