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.