Hi Stephan,

no, this was not the solution. As I understand only lazy fetching is
supported by GAE. What do I have to do to get all child objects? Now I
wrote such procedure, to keep the persistanceManager open, but it did
not help either:

        public OfferDetails getOfferWithId (long id)
        {
                OfferDetails offerDetail;
                pm = PMF.get().getPersistenceManager();
                try {
                Offer offer = pm.getObjectById(Offer.class, id);
                offerDetail = offer.getOfferDetails();
                } finally {
                        pm.close();
                }

                return offerDetail;

On 25 Feb., 09:07, Stephan Hartmann <hartm...@metamesh.de> wrote:
> I think in your Offer class you should use getter/setter for mOfferDetail
> (not a constructor to set the field).
>
> 2010/2/25 Anton Klotz <dipl.ing.akl...@googlemail.com>
>
>
>
> > Hi Jake,
>
> > thanks a lot for your answer.
>
> > After changing the mappedBy statement to child like this:
>
> >       �...@persistent(mappedBy = "mOfferDetails")
> >        private Offer mOffer;
>
> > and removing mappedBy from parent, Offer object seems to be persisted.
> > But when I get this object from the database with:
>
> >        public Offer getOfferWithId (long id)
> >        {
> >                return pm.getObjectById(Offer.class, id);
> >        }
>
> > and try to access child with
>
> >                System.out.printf(String.format ("Title %s",
> > mOffer.getOfferDetails().getOfferDescription() ));
>
> > I get following error:
>
> >  java.lang.NullPointerException
> >        at
>
> > com.sparradar.server.action.actioncommands.ShowOfferDetailsActionCommand.ex 
> > ecute(ShowOfferDetailsActionCommand.java:
> > 41)
> >         at
>
> > info.rk.vaadinapp.manager.urldispatching.URLActionDispatcher.handleURI(URLA 
> > ctionDispatcher.java:
> > 90)
> >        at com.vaadin.ui.Window.handleURI(Window.java:358)
> >        at
>
> > com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleURI(Abstr 
> > actCommunicationManager.java:
> > 1830)
> >        at
>
> > com.vaadin.terminal.gwt.server.CommunicationManager.handleURI(Communication 
> > Manager.java:
> > 311)
> >        at
>
> > com.vaadin.terminal.gwt.server.AbstractApplicationServlet.handleURI(Abstrac 
> > tApplicationServlet.java:
> > 912)
> >        at
>
> > com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractA 
> > pplicationServlet.java:
> > 471)
> >        at
>
> > com.vaadin.terminal.gwt.server.GAEApplicationServlet.service(GAEApplication 
> > Servlet.java:
> > 231)
> >        at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
> >        at
> > org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
> > 487)
> >        at org.mortbay.jetty.servlet.ServletHandler
> > $CachedChain.doFilter(ServletHandler.java:1093)
> >        at
>
> > com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFi 
> > lter.java:
> > 51)
> >        at org.mortbay.jetty.servlet.ServletHandler
> > $CachedChain.doFilter(ServletHandler.java:1084)
> >        at
>
> > com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(Trans 
> > actionCleanupFilter.java:
> > 43)
> >        at org.mortbay.jetty.servlet.ServletHandler
> > $CachedChain.doFilter(ServletHandler.java:1084)
> >        at
>
> > com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFile 
> > Filter.java:
> > 121)
> >        at org.mortbay.jetty.servlet.ServletHandler
> > $CachedChain.doFilter(ServletHandler.java:1084)
> >        at
> > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:
> > 360)
> >        at
> > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:
> > 216)
> >        at
> > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:
> > 181)
> >        at
> > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:
> > 712)
> >        at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
> > 405)
> >        at
>
> > com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEn 
> > gineWebAppContext.java:
> > 70)
> >        at
> > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
> > 139)
> >        at com.google.appengine.tools.development.JettyContainerService
> > $ApiProxyHandler.handle(JettyContainerService.java:352)
> >        at
> > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
> > 139)
> >        at org.mortbay.jetty.Server.handle(Server.java:313)
> >        at
> > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
> > 506)
> >        at org.mortbay.jetty.HttpConnection
> > $RequestHandler.headerComplete(HttpConnection.java:830)
> >        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
> >        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
> >        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
> >        at
> > org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:
> > 396)
> >        at org.mortbay.thread.BoundedThreadPool
> > $PoolThread.run(BoundedThreadPool.java:442)
>
> > I don't get the error if I try to access eg mOffer.getId(). So my
> > interpretation of this error is that either the child object was not
> > saved in the database, or it was not fetched from the database. I
> > don't know how to verify this.
>
> > Thanks,
>
> > Anton
>
> > On 24 Feb., 20:17, Jake <jbrooko...@cast.org> wrote:
> > >http://code.google.com/appengine/docs/java/datastore/relationships.ht...
>
> > > "You create a bidirectional one-to-one relationship using fields on
> > > both classes, with an annotation on the child class's field to declare
> > > that the fields represent a bidirectional relationship. The field of
> > > the child class must have a @Persistent annotation with the argument
> > > mappedBy = "...", where the value is the name of the field on the
> > > parent class."
>
> > > From what I see, you have it backwards, with the annotation in the
> > > parent class.
>
> > > Jake
>
> > > On Feb 24, 4:26 am, Anton Klotz <dipl.ing.akl...@googlemail.com>
> > > wrote:
>
> > > > Hi,
>
> > > > could please somebody tell me, what I'm doing wrong here?
>
> > > > Here is one child datastructure I want to persist:
>
> > > > @PersistenceCapable
>
> > > > public class OfferDetails {
>
> > > >         @PrimaryKey
> > > >         @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
> > > >         private Key mId;
>
> > > >         @Persistent
> > > >         private String mOfferDescription;
>
> > > >         @Persistent
> > > >         private Offer mOffer;
>
> > > >         public OfferDetails ()
> > > >         {
>
> > > >         }
>
> > > >         public OfferDetails (String offerDesc)
> > > >         {
> > > >                 this ();
> > > >                 mOfferDescription = offerDesc;
> > > >         }
>
> > > > }
>
> > > > And here is the parent
>
> > > > @PersistenceCapable(identityType = IdentityType.APPLICATION,
> > > > detachable="true")
>
> > > > public class Offer {
> > > >         @PrimaryKey
> > > >         @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
> > > >         private Key mId;
>
> > > >         @Persistent(mappedBy="mOffer")
> > > >         private OfferDetails mOfferDetails;
>
> > > > public Offer( OfferDetails offerDetails)
> > > >         {
> > > >                 this();
> > > >                 mOfferDetails = offerDetails;
> > > >         }
>
> > > > }
>
> > > > Here is the presistance routine:
>
> > > > public class OfferDataAccess {
> > > >           private static final long serialVersionUID =
> > -7037344095742126014L;
> > > >           private PersistenceManager pm;
>
> > > >           public OfferDataAccess ()
> > > >           {
> > > >                   pm = PMF.get().getPersistenceManager();
> > > >           }
>
> > > >         public void persistOffer (Offer offer)
> > > >         {
> > > >                 pm.currentTransaction().begin();
> > > >                 try {
> > > >                         pm.makePersistent(offer);
> > > >                         pm.currentTransaction().commit();
> > > >                 } finally {
> > > >                         if (pm.currentTransaction().isActive())
> > > >                                 pm.currentTransaction().rollback();
> > > >                         pm.close();
> > > >                 }
> > > >         }
>
> > > > And here is the call of the persistance routine:
> > > > class CreateOfferActionCommand
> > > > {
> > > >         public void execute() {
> > > >                 mOfferDB = new OfferDataAccess ();
> > > >                 mOffer = new Offer (mOfferDetails);
> > > >                 mOfferDB.persistOffer (mOffer);
>
> > > > }
> > > > }
>
> > > > Now if I run this code, I get following errormessage:
>
> > > > java.lang.IllegalStateException: Primary key for object of type
> > > > OfferDetails is null.
> > > >         at
>
> > org.datanucleus.store.appengine.EntityUtils.getPkAsKey(EntityUtils.java:
> > > > 152)
> > > >         at
>
> > org.datanucleus.store.appengine.DatastoreFieldManager.getKeyForObject(Datas
> > toreFieldManager.java:
> > > > 625)
> > > >         at
>
> > org.datanucleus.store.appengine.DatastoreFieldManager.getParentKeyFromParen
> > tField(DatastoreFieldManager.java:
> > > > 634)
> > > >         at
>
> > org.datanucleus.store.appengine.DatastoreFieldManager.establishEntityGroup(
> > DatastoreFieldManager.java:
> > > > 591)
> > > >         at
>
> > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPreProces
> > s(DatastorePersistenceHandler.java:
> > > > 338)
> > > >         at
>
> > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(D
> > atastorePersistenceHandler.java:
> > > > 246)
> > > >         at
>
> > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(Da
> > tastorePersistenceHandler.java:
> > > > 235)
> > > >         at
>
> > org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateMa
> > nagerImpl.java:
> > > > 3185)
> > > >         at
>
> > org.datanucleus.state.JDOStateManagerImpl.makePersistent(JDOStateManagerImp
> > l.java:
> > > > 3161)
> > > >         at
>
> > org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.j
> > ava:
> > > > 1298)
> > > >         at
> > > > org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:
> > > > 1175)
> > > >         at
>
> > org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceM
> > anager.java:
> > > > 669)
> > > >         at
>
> > org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceMana
> > ger.java:
> > > > 694)
> > > >         at
>
> > com.sparradar.server.datamodel.offer.OfferDataAccess.persistOffer(OfferData
> > Access.java:
> > > > 29)
> > > >         at
>
> > com.sparradar.server.action.actioncommands.CreateOfferActionCommand.execute
> > (CreateOfferActionCommand.java:
> > > > 60)
> > > >         at
>
> > info.rk.vaadinapp.manager.urldispatching.URLActionDispatcher.handleURI(URLA
>
> ...
>
> Erfahren Sie mehr »

-- 
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 google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to