Sorry if it is a duplicate, but I coudn't find any solutions for this
problem. I'm not sure if someone else solved this, and any help would be
very helpfull.
This seems like those rare corner cases, but it happened:
Using this data models:
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value =
"true")
private String key;
@Extension(vendorName = "datanucleus", key = "gae.pk-id", value =
"true")
private Long id;
@ManyToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> relatedChilds = new ArrayList<Child>();
@Embedded
private InlineChild inlineChild;
public List<Child> getRelatedChilds() {
return relatedChilds;
}
public void setRelatedChilds(List<Child> relatedChilds) {
this.relatedChilds = relatedChilds;
}
public InlineChild getInlineChild() {
return inlineChild;
}
public void setInlineChild(InlineChild inlineChild) {
this.inlineChild = inlineChild;
}
public String getKey() {
return key;
}
public Long getId() {
return id;
}
}
@Entity
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value =
"true")
private String key;
@Extension(vendorName = "datanucleus", key = "gae.pk-id", value =
"true")
private Long id;
private String name;
@SuppressWarnings("unused")
@OneToMany
private Parent parent;
public Child(Parent parent) {
this.parent = parent;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getKey() {
return key;
}
public Long getId() {
return id;
}
}
@Embeddable
public class InlineChild {
private String name;
private Date creationDate;
private List<String> urls;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public List<String> getUrls() {
return urls;
}
public void setUrls(List<String> urls) {
this.urls = urls;
}
}
And this JUnit test case fails for the test #3:
public class OutOfIndexTest {
LocalServiceTestHelper helper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig());
@Before
public void setUp() throws Exception {
helper.setUp();
}
@After
public void tearDown() throws Exception {
helper.tearDown();
}
@Test
public void testPersistParentOnly() {
EntityManager em = EMF.get().createEntityManager();
Parent p = new Parent();
em.persist(p);
em.close();
}
@Test
public void testPersistParentWithRelatedChild() {
EntityManager em = EMF.get().createEntityManager();
Parent p = new Parent();
p.getRelatedChilds().add(new Child(p));
em.persist(p);
em.close();
}
@Test
public void testPersistParentWithAllChilds() {
// This test fails, but only if the embeded has a list.
EntityManager em = EMF.get().createEntityManager();
Parent p = new Parent();
p.getRelatedChilds().add(new Child(p));
p.setInlineChild(new InlineChild());
em.persist(p);
em.close();
}
@Test
public void testAddEmbededAfterPersistAllChilds() {
EntityManager em = EMF.get().createEntityManager();
Parent p = new Parent();
p.getRelatedChilds().add(new Child(p));
em.persist(p);
em.close();
em = EMF.get().createEntityManager();
p.setInlineChild(new InlineChild());
em.merge(p);
}
}
Whith this StackTrace:
java.lang.IllegalArgumentException: out of field index :-1
at org.example.fieldindex.InlineChild.jdoProvideField(InlineChild.java)
at
org.datanucleus.state.JDOStateManagerImpl.provideField(JDOStateManagerImpl.java:2585)
at
org.datanucleus.state.JDOStateManagerImpl.provideField(JDOStateManagerImpl.java:2555)
at
org.datanucleus.store.mapped.mapping.CollectionMapping.postInsert(CollectionMapping.java:91)
at
org.datanucleus.store.mapped.mapping.EmbeddedPCMapping.postInsert(EmbeddedPCMapping.java:104)
at
org.datanucleus.store.appengine.DatastoreRelationFieldManager.runPostInsertMappingCallbacks(DatastoreRelationFieldManager.java:217)
at
org.datanucleus.store.appengine.DatastoreRelationFieldManager.access$200(DatastoreRelationFieldManager.java:48)
at
org.datanucleus.store.appengine.DatastoreRelationFieldManager$1.apply(DatastoreRelationFieldManager.java:116)
at
org.datanucleus.store.appengine.DatastoreRelationFieldManager.storeRelations(DatastoreRelationFieldManager.java:81)
at
org.datanucleus.store.appengine.DatastoreFieldManager.storeRelations(DatastoreFieldManager.java:955)
at
org.datanucleus.store.appengine.DatastorePersistenceHandler.storeRelations(DatastorePersistenceHandler.java:546)
at
org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPostProcess(DatastorePersistenceHandler.java:304)
at
org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java:256)
at
org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:240)
at
org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3185)
at
org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4513)
at
org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:2814)
at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:2754)
at
org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:2893)
at
org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:369)
at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:256)
at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:801)
at
org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java:271)
at
org.datanucleus.jpa.EntityManagerImpl.close(EntityManagerImpl.java:153)
at
org.datanucleus.store.appengine.jpa.DatastoreEntityManager.close(DatastoreEntityManager.java:62)
at
org.example.fieldindex.OutOfIndexTest.testPersistParentWithAllChilds(OutOfIndexTest.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Am I doin't the mapping/persistence on case #3 wrong? I also attached the a
full eclipse project with that code, incase it helps.
Thanks a lot for any help.
Best Regards,
--
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.