It shouldn't be needed, since according to the docs [1], the Key
type is only required to record parent relation in the child.
But I tried it anyways and got pretty much the same exception:
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)
...
regards,
Eugene
[1]
http://code.google.com/appengine/docs/java/datastore/creatinggettinganddeletingdata.html#Keys
On Dec 18, 2:33 pm, Rusty Wright <[email protected]> wrote:
> 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 [email protected].
> > To unsubscribe from this group, send email to
> > [email protected].
> > For more options, visit this group
> > athttp://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 [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.