http://code.google.com/appengine/docs/java/datastore/relationships.html#Owned_One_to_One_Relationships
"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(DatastoreFieldManager.java: > 625) > at > org.datanucleus.store.appengine.DatastoreFieldManager.getParentKeyFromParentField(DatastoreFieldManager.java: > 634) > at > org.datanucleus.store.appengine.DatastoreFieldManager.establishEntityGroup(DatastoreFieldManager.java: > 591) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPreProcess(DatastorePersistenceHandler.java: > 338) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java: > 246) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java: > 235) > at > org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java: > 3185) > at > org.datanucleus.state.JDOStateManagerImpl.makePersistent(JDOStateManagerImpl.java: > 3161) > at > org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java: > 1298) > at > org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java: > 1175) > at > org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java: > 669) > at > org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java: > 694) > at > com.sparradar.server.datamodel.offer.OfferDataAccess.persistOffer(OfferDataAccess.java: > 29) > at > com.sparradar.server.action.actioncommands.CreateOfferActionCommand.execute(CreateOfferActionCommand.java: > 60) > 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) > > 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]. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
