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].
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to