Re: [appengine-java] Re: Problem with persistance
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.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 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
[appengine-java] Re: Problem with persistance
I think in your Offer class you should use getter/setter for mOfferDetail (not a constructor to set the field). Can't see why that would make the slightest difference. What does appear iffy is that if you have a bidirectional relation then the user is responsible for setting both sides. I only see Offer.mOfferDetails being set and not the other side. -- 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.
Re: [appengine-java] Re: Problem with persistance
2010/2/25 datanucleus andy_jeffer...@yahoo.com I think in your Offer class you should use getter/setter for mOfferDetail (not a constructor to set the field). Can't see why that would make the slightest difference. What does appear iffy is that if you have a bidirectional relation then the user is responsible for setting both sides. I only see Offer.mOfferDetails being set and not the other side. isn't setting Offer.mOfferDetails enough for making Offer.getOfferDetails() returning not null, even if it is a bidirectional relation? -- 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.comgoogle-appengine-java%2bunsubscr...@googlegroups.com . 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 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.
[appengine-java] Re: Problem with persistance
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
[appengine-java] Re: Problem with persistance
You may want to look into the JDO fetch groups, hollow returns of objects, makeTransient, and other items having to do with what is fetched and what remains accessible after the persistence manager is closed. The DataNucleus documentation is a pretty good place to look at that. I'm somewhat new to this, but had similar troubles and found my answers there. Jake On Feb 25, 8:36 am, datanucleus andy_jeffer...@yahoo.com wrote: interpretation of this error is that either the child object was not saved in the database, or it was not fetched from the database. GAE/J has some DB viewer, so debugging if it is actually in the database is kinda step 1. Then look at the log, since that is why it exists -- 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.
[appengine-java] Re: Problem with persistance
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 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(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:
[appengine-java] Re: Problem with persistance
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 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 =