Try making the parent's primary key be Key instead of String.
Eugene Kuleshov wrote: > 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 google-appengine-j...@googlegroups.com. > To unsubscribe from this group, send email to > google-appengine-java+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/google-appengine-java?hl=en. > > -- 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.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.