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.

Reply via email to