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.

Reply via email to