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.