[appengine-java] Re: List of embedded class objects in default fetch group

2009-12-27 Thread andreas_b
Back to work after the holidays :-).
I changed the inner class to be a separate entity by itself, and then
it works perfectly fine.
It makes no sense to have that class public in my context, so I want
to have it embedded,
which leaves me with the same question..what am I doing wrong in the
embedded case?

BR, Andreas

On 23 Dec, 13:38, andreas_b andreas.borg...@gmail.com wrote:
 Hi.

 I'm using 1.3.0, but further investigations shows that this might not
 be related to lazy loading after all.
 I don't seem to be able to save/retrieve lists of embedded objects at
 all...

 I wrote some test examples to show my problem. I probably do something
 wrong here, but I really can't figure out what...

 @PersistenceCapable(identityType = IdentityType.APPLICATION)
 public class Test {

     @PrimaryKey
     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
     @Extension(vendorName=datanucleus, key=gae.encoded-pk,
 value=true)
     private String iEncodedKey;

     @Persistent(defaultFetchGroup = true)
     private ListInnerTest innerTests;

     @PersistenceCapable
     @EmbeddedOnly
     public static class InnerTest{

         @Persistent
         private String whatever;

         public InnerTest(){
                 whatever = whatever;
         }
     }

     public Test(){ }

     public void addSomeInnerTests(){
         innerTests = new ArrayListInnerTest();

         for(int i = 0; i  5; ++i)
                 innerTests.add(new InnerTest());
     }

     public ListInnerTest getInnerTests(){
         return innerTests;
     }

 }

 and then I use the following testcode to save and retrieve the objects

 // For saving
 Test test = new Test();
 test.addSomeInnerTests();

 Test saved = pm.makePersistent(test);
 System.out.println(persisted Test innerTests size =  +
 saved.getInnerTests().size());
 System.out.println(Saved Test key =  + saved.getKey());

 // For retrieving
 Query query = pm.newQuery(Test.class);
 ListTest list = (ListTest)query.execute();
 System.out.println(Tests =  + list.size());

 for(Test test : list){
         System.out.println(Retrieved Test key =  + test.getKey());
         ListInnerTest innerTests = test.getInnerTests();
         System.out.println(innerTests size =  + innerTests.size());

 }

 and this provides the following output

 persisted Test innerTests size = 5
 Saved Test key = agtib2xsdHJvbGxlbnIMCxIEVGVzdBjbsAEM
 Tests = 1
 Retrieved Test key = agtib2xsdHJvbGxlbnIMCxIEVGVzdBjbsAEM
 innerTests size = 0

 So, why is the List in the retrieved Test empty? I have tried
 retrieving an object directly as well, but this naturally leads to an
 IndexOutOfBounds.
 In my real code, all the other variables are saved and retrieved
 properly. I have Lists of Strings and such as well, and they work just
 fine, so its definitely related to children/embedded objects.

 Any help is appreciated.

 Thanks / Andreas

 On 23 Dec, 07:32, Ikai L (Google) ika...@google.com wrote:

  Embedded objects should be eager loaded with any SDK version 1.2.8+ and
  above. Is this the version you are on? It's only child objects that are not
  eager loaded now.

  On Tue, Dec 22, 2009 at 3:15 PM, andreas_b andreas.borg...@gmail.comwrote:

   Hi all.

   I'm struggling a bit with default fetch groups in one of my entities
   here..

   Basically I have something that looks like this

   @PersistenceCapable(identityType = IdentityType.APPLICATION,
   detachable=true)
   public class A {

   �...@persistent(defaultFetchGroup = true)
    private ListB embeddedObjects;

   �...@persistencecapable(detachable=true)
   �...@embeddedonly
    public static class B {
    
    }
   }

   I want the list of my B objects to be fetched automatically when I
   retrieve A from the datastore. This does not work however. It still
   seems to do lazy loading and I get the following warning:

   2009-dec-22 23:57:52 org.datanucleus.store.appengine.MetaDataValidator
   warn
   WARNING: Meta-data warning for A.embeddedObjects: The datastore does
   not support joins and therefore cannot honor requests to place child
   objects in the default fetch group.  The field will be fetched lazily
   on first access...

   The above works fine if I change it to just: private B object, so the
   problem seems related to List or collections in general. I have been
   trying to find some explanation on this both in datanucleus docs and
   here, but have been unable to find it.

   Oh, and I can't use the touch technique since I use generic object
   retrieval and that code has no knowledge of what the class contains,
   and I want to keep it that way.

   Could someone explain how this works (or point me to someplace) and
   how I can solve it?

   Thanks in advance.

   BR, Andreas

   --

   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
   google-appengine-j...@googlegroups.com.
   To unsubscribe from this group, send email to
  

[appengine-java] Re: List of embedded class objects in default fetch group

2009-12-23 Thread andreas_b
Hi.

I'm using 1.3.0, but further investigations shows that this might not
be related to lazy loading after all.
I don't seem to be able to save/retrieve lists of embedded objects at
all...

I wrote some test examples to show my problem. I probably do something
wrong here, but I really can't figure out what...

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Test {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName=datanucleus, key=gae.encoded-pk,
value=true)
private String iEncodedKey;

@Persistent(defaultFetchGroup = true)
private ListInnerTest innerTests;

@PersistenceCapable
@EmbeddedOnly
public static class InnerTest{

@Persistent
private String whatever;

public InnerTest(){
whatever = whatever;
}
}

public Test(){ }

public void addSomeInnerTests(){
innerTests = new ArrayListInnerTest();

for(int i = 0; i  5; ++i)
innerTests.add(new InnerTest());
}

public ListInnerTest getInnerTests(){
return innerTests;
}
}


and then I use the following testcode to save and retrieve the objects

// For saving
Test test = new Test();
test.addSomeInnerTests();

Test saved = pm.makePersistent(test);
System.out.println(persisted Test innerTests size =  +
saved.getInnerTests().size());
System.out.println(Saved Test key =  + saved.getKey());

// For retrieving
Query query = pm.newQuery(Test.class);
ListTest list = (ListTest)query.execute();
System.out.println(Tests =  + list.size());

for(Test test : list){
System.out.println(Retrieved Test key =  + test.getKey());
ListInnerTest innerTests = test.getInnerTests();
System.out.println(innerTests size =  + innerTests.size());
}

and this provides the following output

persisted Test innerTests size = 5
Saved Test key = agtib2xsdHJvbGxlbnIMCxIEVGVzdBjbsAEM
Tests = 1
Retrieved Test key = agtib2xsdHJvbGxlbnIMCxIEVGVzdBjbsAEM
innerTests size = 0


So, why is the List in the retrieved Test empty? I have tried
retrieving an object directly as well, but this naturally leads to an
IndexOutOfBounds.
In my real code, all the other variables are saved and retrieved
properly. I have Lists of Strings and such as well, and they work just
fine, so its definitely related to children/embedded objects.

Any help is appreciated.

Thanks / Andreas



On 23 Dec, 07:32, Ikai L (Google) ika...@google.com wrote:
 Embedded objects should be eager loaded with any SDK version 1.2.8+ and
 above. Is this the version you are on? It's only child objects that are not
 eager loaded now.

 On Tue, Dec 22, 2009 at 3:15 PM, andreas_b andreas.borg...@gmail.comwrote:



  Hi all.

  I'm struggling a bit with default fetch groups in one of my entities
  here..

  Basically I have something that looks like this

  @PersistenceCapable(identityType = IdentityType.APPLICATION,
  detachable=true)
  public class A {

  �...@persistent(defaultFetchGroup = true)
   private ListB embeddedObjects;

  �...@persistencecapable(detachable=true)
  �...@embeddedonly
   public static class B {
   
   }
  }

  I want the list of my B objects to be fetched automatically when I
  retrieve A from the datastore. This does not work however. It still
  seems to do lazy loading and I get the following warning:

  2009-dec-22 23:57:52 org.datanucleus.store.appengine.MetaDataValidator
  warn
  WARNING: Meta-data warning for A.embeddedObjects: The datastore does
  not support joins and therefore cannot honor requests to place child
  objects in the default fetch group.  The field will be fetched lazily
  on first access...

  The above works fine if I change it to just: private B object, so the
  problem seems related to List or collections in general. I have been
  trying to find some explanation on this both in datanucleus docs and
  here, but have been unable to find it.

  Oh, and I can't use the touch technique since I use generic object
  retrieval and that code has no knowledge of what the class contains,
  and I want to keep it that way.

  Could someone explain how this works (or point me to someplace) and
  how I can solve it?

  Thanks in advance.

  BR, Andreas

  --

  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
  google-appengine-j...@googlegroups.com.
  To unsubscribe from this group, send email to
  google-appengine-java+unsubscr...@googlegroups.comgoogle-appengine-java%2bunsubscr...@googlegroups.com
  .
  For more options, visit this group at
 http://groups.google.com/group/google-appengine-java?hl=en.

 --
 Ikai Lan
 Developer Programs Engineer, Google App Engine

--

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 google-appengine-j...@googlegroups.com.
To unsubscribe from this