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.

Reply via email to