Does this only happen if you set a child object for the parent object? It'd be helpful to figure out what exact operation causes this to happen.
On Sat, Jan 30, 2010 at 1:28 PM, Sydney <[email protected]> wrote: > I want to use the following model in the datastore but when I make my > data persistent I got an exception. The model is the following: > A has a list of B > B has a list of abstract C > I did not include the getter/setter methods. > > @PersistenceCapable(identityType = > javax.jdo.annotations.IdentityType.APPLICATION) > public class A { > > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", > value = "true") > private String key; > @Persistent > @Extension(vendorName = "datanucleus", key = "gae.pk-name", value > = "true") > private String name; > @Persistent(mappedBy = "a") > private List<B> bs; > > public A(String name) { > this.name = name; > bs = new ArrayList<B>(); > } > } > > @PersistenceCapable(identityType = > javax.jdo.annotations.IdentityType.APPLICATION) > public class B { > > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", > value = "true") > private String key; > @Persistent > @Extension(vendorName = "datanucleus", key = "gae.pk-name", value > = "true") > private String name; > @Persistent(mappedBy = "b") > private List<C> cs; > @Persistent > private A a; > > public B(String name) { > this.name = name; > cs = new ArrayList<C>(); > } > } > > @PersistenceCapable(identityType = > javax.jdo.annotations.IdentityType.APPLICATION) > @Inheritance(strategy = > javax.jdo.annotations.InheritanceStrategy.SUBCLASS_TABLE) > public class C { > > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", > value = "true") > private String key; > @Persistent > @Extension(vendorName = "datanucleus", key = "gae.pk-name", value > = "true") > private String name; > @Persistent > private B b; > > public C(String name) { > this.name = name; > } > } > > The program is: > > ApiProxy.setEnvironmentForCurrentThread(new TestEnvironment > ()); > ApiProxy.setDelegate(new ApiProxyLocalImpl(new File(".")) > { > }); > A a = new A("A"); > B b = new B("B"); > a.getBs().add(b); > C c = new C("C"); > b.getCs().add(c); > PersistenceManagerFactory pmf = > JDOHelper.getPersistenceManagerFactory("transactions-optional"); > PersistenceManager pm = pmf.getPersistenceManager(); > Transaction tx = pm.currentTransaction(); > try { > tx.begin(); > pm.makePersistent(a); > tx.commit(); > } finally { > if (tx.isActive()) { > tx.rollback(); > } > } > > The output: > > java.lang.ArrayIndexOutOfBoundsException: 0 > at org.datanucleus.store.mapped.scostore.FKListStore.<init> > (FKListStore.java:133) > at org.datanucleus.store.appengine.DatastoreFKListStore.<init> > (DatastoreFKListStore.java:40) > at org.datanucleus.store.appengine.DatastoreManager.newFKListStore > (DatastoreManager.java:454) > at > > org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForCollection > (MappedStoreManager.java:729) > at > org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForField > (MappedStoreManager.java:646) > at org.datanucleus.store.mapped.mapping.CollectionMapping.postInsert > (CollectionMapping.java:157) > at > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.runPostInsertMappingCallbacks > (DatastoreRelationFieldManager.java:221) > at > org.datanucleus.store.appengine.DatastoreRelationFieldManager.access > $200(DatastoreRelationFieldManager.java:47) > at org.datanucleus.store.appengine.DatastoreRelationFieldManager > $1.apply(DatastoreRelationFieldManager.java:108) > at > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.storeRelations > (DatastoreRelationFieldManager.java:78) > at > org.datanucleus.store.appengine.DatastoreFieldManager.storeRelations > (DatastoreFieldManager.java:812) > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPostProcess > (DatastorePersistenceHandler.java:288) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects > (DatastorePersistenceHandler.java:241) > 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.sco.SCOUtils.validateObjectForWriting > (SCOUtils.java:1476) > at > > org.datanucleus.store.mapped.scostore.ElementContainerStore.validateElementForWriting > (ElementContainerStore.java:380) > at > org.datanucleus.store.mapped.scostore.FKListStore.validateElementForWriting > (FKListStore.java:609) > at org.datanucleus.store.mapped.scostore.FKListStore.internalAdd > (FKListStore.java:344) > at org.datanucleus.store.mapped.scostore.AbstractListStore.addAll > (AbstractListStore.java:128) > at org.datanucleus.store.mapped.mapping.CollectionMapping.postInsert > (CollectionMapping.java:157) > at > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.runPostInsertMappingCallbacks > (DatastoreRelationFieldManager.java:221) > at > org.datanucleus.store.appengine.DatastoreRelationFieldManager.access > $200(DatastoreRelationFieldManager.java:47) > at org.datanucleus.store.appengine.DatastoreRelationFieldManager > $1.apply(DatastoreRelationFieldManager.java:108) > at > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.storeRelations > (DatastoreRelationFieldManager.java:78) > at > org.datanucleus.store.appengine.DatastoreFieldManager.storeRelations > (DatastoreFieldManager.java:812) > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPostProcess > (DatastorePersistenceHandler.java:288) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects > (DatastorePersistenceHandler.java:241) > 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) > > -- > 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]<google-appengine-java%[email protected]> > . > 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 http://googleappengine.blogspot.com | http://twitter.com/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 [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.
