There are many open issues with JDO and lists of children and I also experience the one you describe. Did you already file an issue here: http://code.google.com/p/datanucleus-appengine/issues/list ?
Please post the issue ID here and upload a sample project if you have. Thanks. On 2 Aug., 22:49, Art <[email protected]> wrote: > Hari, thank you for your input. > However, I'm not looking for the work around like you suggested to do > like pm.makePersistentAll( b.getChapters()). (by the way, you didn't > mean to do like pm.makePersistentAll( b.getChapters().get( 0), > right?) > > The thing is that I like to know JDO and appengine's datastore better. > If I have the wrong concepts of those in my mind, then of cause I'm > going to spend my precious time for writing codes what are not going > to work and going to have trouble, right? (And having and already had > enough trouble, actually. ;-)) Also, it doesn't feel good to write > code like "if I write this way, then it doesn't work, but write other > way, mysteriously works." ;-) > > Back to subject: interestingly enough, if I added the codes to get the > targeted chapter object by getObjectById, detach it, change it, and > persist it, then, after that, the previously failing unit test part > passed. Why? Is there the known and open issue for this? Or I'm > missing something like usual. ;-) > > prepTestObjects(); > > Chapter detachedChapter; > > // Inserting the codes below misteriously made the following unit > test pass. ---------------------- > pm = pmf.getPersistenceManager(); > Chapter chapter = > (Chapter)pm.getObjectById( Chapter.class, > b.getChapters().get( 0).getEncodedKey()); > detachedChapter = (Chapter)pm.detachCopy( chapter); > pm.close(); > int numPages = detachedChapter.getNumPages(); > detachedChapter.setNumPages( numPages + 1); > pm = pmf.getPersistenceManager(); > pm.makePersistent( detachedChapter); > pm.close(); > pm = pmf.getPersistenceManager(); > chapter = > (Chapter)pm.getObjectById( Chapter.class, > b.getChapters().get( 0).getEncodedKey()); > detachedChapter = (Chapter)pm.detachCopy( chapter); > pm.close(); > assertEquals( numPages + 1, detachedChapter.getNumPages()); > // > ------------------------------------------------------------------------------------------------ > int originalNumPages = b.getChapters().get( 0).getNumPages(); > do { > b.getChapters().get( 0).setNumPages( > new Double( Math.round( Math.random() * > 99)).intValue() + 1 > ); > } while( originalNumPages == b.getChapters().get( 0).getNumPages()); > int newNumPages = b.getChapters().get( 0).getNumPages(); > > pm = pmf.getPersistenceManager(); > pm.makePersistent( b.getChapters().get( 0)); > detachedChapter = (Chapter)pm.detachCopy( b.getChapters().get( 0)); > pm.close(); > //This failed before inserting codes above, but now it pass. Why? > assertEquals( newNumPages, detachedChapter.getNumPages()); > > On Jul 30, 8:45 pm, Hariharan Anantharaman > > <[email protected]> wrote: > > Hi, > > Try using the method makePersistentAll. I too faced similar issue and using > > the all method worked fine. > > > ~hari > > > On Jul 31, 2010 6:07 AM, "Art" <[email protected]> wrote: > > > Dear group, > > > I would like to know the reason why child value won't be stored when > > it's persisted directly by referring as a element of list field of > > parent. > > In the next testDetach7 JUnit test (which tries to change the value of > > existing child entity field), > > - chapter child object was not stored by persisting like > > pm.makePersistent( b.getChapters().get( 0)) > > - chapter child object was stored by persisting the parent like by > > pm.makePersistent( b); > > > public void testDetach7() throws Exception { > > prepTestObjects(); > > > int originalNumPages = b.getChapters().get( 0).getNumPages(); > > do { > > b.getChapters().get( 0).setNumPages( > > new Double( Math.round( Math.random() > > * 99)).intValue() + 1 > > ); > > } while( originalNumPages == b.getChapters().get( > > 0).getNumPages()); > > int newNumPages = b.getChapters().get( 0).getNumPages(); > > > /* > > pm = pmf.getPersistenceManager(); > > pm.makePersistent( b.getChapters().get( 0)); > > Chapter detachedChapter = > > (Chapter)pm.detachCopy( b.getChapters().get( 0)); > > pm.close(); > > This fails > > assertEquals( newNumPages, detachedChapter.getNumPages()); > > */ > > > pm = pmf.getPersistenceManager(); > > pm.makePersistent( b); > > Chapter detachedChapter = > > (Chapter)pm.detachCopy( b.getChapters().get( 0)); > > pm.close(); > > // This will pass > > assertEquals( newNumPages, detachedChapter.getNumPages()); > > > } > > > protected void prepTestObjects() throws Exception { > > b = new Book(); > > b.setTitle( "JDO 4eva"); > > > c1 = new Chapter(); > > c1.setTitle( "Intro"); > > c1.setNumPages( 10); > > > b.getChapters().add( c1); > > > c2 = new Chapter(); > > c2.setTitle( "Configuration"); > > c2.setNumPages( 9); > > b.getChapters().add( c2); > > > pm = pmf.getPersistenceManager(); > > pm.setDetachAllOnCommit( true); > > try { > > pm.currentTransaction().begin(); > > pm.makePersistent( b); > > pm.currentTransaction().commit(); > > } finally { > > if (pm.currentTransaction().isActive()) { > > pm.currentTransaction().rollback(); > > } > > pm.close(); > > } > > } > > > /** > > * > > Fromhttp://gae-java-persistence.blogspot.com/2009/10/creating-bidrectiona... > > */ > > @PersistenceCapable(identityType = IdentityType.APPLICATION, > > detachable = "true") > > public class Book { > > > // Prefer String encodedKey over Key class object since it's sharable > > with client via serialization > > �...@primarykey > > �...@persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > �...@extension( vendorName = "datanucleus", key = "gae.encoded-pk", > > value="true") > > protected String encodedKey; > > > protected String title; > > > �...@persistent(mappedBy = "book", defaultFetchGroup="true") > > �...@element( dependent = "true") > > protected List<Chapter> chapters = new ArrayList<Chapter>(); > > > - getter and setters - > > > } > > > @PersistenceCapable( identityType = IdentityType.APPLICATION, > > detachable = "true") > > public class Chapter { > > // Prefer String encodedKey over Key class object since it's sharable > > with client via serialization > > �...@primarykey > > �...@persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > �...@extension( vendorName = "datanucleus", key = "gae.encoded-pk", > > value="true") > > protected String encodedKey; > > > protected String title; > > protected int numPages; > > > �...@persistent( defaultFetchGroup = "true") > > protected Book book; > > > - getter and setters - > > > } > > > -- > > 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 > > athttp://groups.google.com/group/google-appengine-java?hl=en. -- 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.
