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 <[email protected]>

> 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.execute(ShowOfferDetailsActionCommand.java:
> 41)
>         at
>
> info.rk.vaadinapp.manager.urldispatching.URLActionDispatcher.handleURI(URLActionDispatcher.java:
> 90)
>        at com.vaadin.ui.Window.handleURI(Window.java:358)
>        at
>
> com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleURI(AbstractCommunicationManager.java:
> 1830)
>        at
>
> com.vaadin.terminal.gwt.server.CommunicationManager.handleURI(CommunicationManager.java:
> 311)
>        at
>
> com.vaadin.terminal.gwt.server.AbstractApplicationServlet.handleURI(AbstractApplicationServlet.java:
> 912)
>        at
>
> com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:
> 471)
>        at
>
> com.vaadin.terminal.gwt.server.GAEApplicationServlet.service(GAEApplicationServlet.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(ServeBlobFilter.java:
> 51)
>        at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1084)
>        at
>
> com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:
> 43)
>        at org.mortbay.jetty.servlet.ServletHandler
> $CachedChain.doFilter(ServletHandler.java:1084)
>        at
>
> com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.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(DevAppEngineWebAppContext.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 <[email protected]> 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 <[email protected]>
> > 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
> 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)
> >
> > > Could you please tell me, what I'm doing wrong here?
>
> --
> 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 at
> http://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