I am using the app engine SDK 1.3.0 with the latest Google Eclipse
plugin.

  Currently, in order to be able to run queries on attributes of the
parent object I have to embed parent object into a child. So, I have
created the following classes

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Parent {
  @PrimaryKey @Persistent String parentName;
  @Persistent(mappedBy = "parent") List<Child> children = new
ArrayList<Child>();

  public Parent(String parentName) { this.parentName = parentName; }
  public void setParentName(String parentName) { this.parentName =
parentName; }
  public String getParentName() { return parentName; }
  public List<Child> getChildren() { return children; }
  public void addChild(Child child) {
    child.setParent(this);
    children.add(child);
  }
}

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Child {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) Key
childKey;
  @Persistent String childName;

  @Embedded(
    members = { @Persistent(name = "parentName", column =
"childParentName") },
    ownerMember = "children")
  @Persistent Parent parent;

  public Child(String childName) { this.childName = childName; }
  public void setChildName(String childName) { this.childName =
childName; }
  public String getChildName() { return childName; }
  public void setParent(Parent parent) { this.parent = parent; }
  public Parent getParent() { return parent; }
}
  and then I created a simple test to verify if I can persist and run
queries on those objects:

public class ParentTest {
  public static void main(String[] args) {
    Parent parent1 = new Parent("parent1");
    parent1.addChild(new Child("child1"));
    parent1.addChild(new Child("child2"));

    Parent parent2 = new Parent("parent2");
    parent2.addChild(new Child("child3"));

    ApiProxy.setEnvironmentForCurrentThread(new TestEnvironment());
    ApiProxy.setDelegate(new ApiProxyLocalImpl(new File(".")) { });

    ApiProxyLocalImpl proxy = (ApiProxyLocalImpl) ApiProxy.getDelegate
();
    proxy.setProperty(LocalDatastoreService.NO_STORAGE_PROPERTY,
Boolean.TRUE.toString());

    PersistenceManagerFactory pmf =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
    PersistenceManager pm = pmf.getPersistenceManager();
    Transaction tx = pm.currentTransaction();
    try {
      tx.begin();
      pm.makePersistent(parent1);
      tx.commit();

      tx.begin();
      pm.makePersistent(parent2);
      tx.commit();

      Query query2 = pm.newQuery(Child.class);
      query2.setFilter("parent.parentName==parentNameParam");
      query2.declareParameters("java.lang.String parentNameParam");
      List<Child> results2 = (List<Child>) query2.executeWithArray
("parent1");
      System.err.println(results2);
    } finally {
      if (tx.isActive()) {
        tx.rollback();
      }
      pm.close();
    }
  }
}

  The DataNucleus Enhancer runs ok on the above code, but when I run
my test app, I am getting an IndexOutOfBoundException from somewhere
in the DataNucleus internals:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at org.datanucleus.store.appengine.DatastoreTable.initializeNonPK
(DatastoreTable.java:356)
        at org.datanucleus.store.appengine.DatastoreTable.buildMapping
(DatastoreTable.java:285)
        at org.datanucleus.store.appengine.DatastoreManager.buildStoreData
(DatastoreManager.java:405)
        at org.datanucleus.store.appengine.DatastoreManager.newStoreData
(DatastoreManager.java:363)
        at org.datanucleus.store.AbstractStoreManager.addClasses
(AbstractStoreManager.java:788)
        at org.datanucleus.store.AbstractStoreManager.addClass
(AbstractStoreManager.java:759)
        at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass
(MappedStoreManager.java:358)
        at org.datanucleus.store.appengine.DatastoreManager.getDatastoreClass
(DatastoreManager.java:631)
        at
org.datanucleus.store.appengine.DatastoreFieldManager.buildMappingConsumer
(DatastoreFieldManager.java:1008)
        at
org.datanucleus.store.appengine.DatastoreFieldManager.buildMappingConsumer
(DatastoreFieldManager.java:998)
        at org.datanucleus.store.appengine.DatastoreFieldManager.<init>
(DatastoreFieldManager.java:133)
        at org.datanucleus.store.appengine.DatastoreFieldManager.<init>
(DatastoreFieldManager.java:167)
        at
org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPreProcess
(DatastorePersistenceHandler.java:316)
        at
org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects
(DatastorePersistenceHandler.java:236)
        at
org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject
(DatastorePersistenceHandler.java:225)
        at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent
(JDOStateManagerImpl.java:3185)
        at org.datanucleus.state.JDOStateManagerImpl.makePersistent
(JDOStateManagerImpl.java:3161)
        at org.datanucleus.ObjectManagerImpl.persistObjectInternal
(ObjectManagerImpl.java:1298)
        at org.datanucleus.ObjectManagerImpl.persistObject
(ObjectManagerImpl.java:1175)
        at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent
(JDOPersistenceManager.java:669)
        at org.datanucleus.jdo.JDOPersistenceManager.makePersistent
(JDOPersistenceManager.java:694)
        at org.testgae.ParentTest.main(ParentTest.java:38)

  Am I doing something wrong or there is some other way to have parent-
child relationship that provides some mechanism include paren'ts
attributes in query criteria?

  Thanks

  Eugene


--

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