Um, please disregard this previous post. I figured out my mistake. I was treating the relationship as I would a foreign-key relationship in an RDBMS solution. Including the refernce to the Event object (as a owned on-to-many relatioship) fixed my problem. This does beg a question, however: How does GAE handle scaling of the objects stored in the Parent objects list. If, for instance, one user creates 10,000 records, building a Profile object on log in would imply that it was "stuffed" with all these objects as well. This seems potentiall very resource intensive. How can this kind of relationship/query structure be optimized?
Thanks, Corey On Nov 5, 12:54 pm, Corey <[email protected]> wrote: > Hello, > I have just started working with the GAE's Java implementation and > have quicly run into problems attempting to run rather simple queries, > I am hoping I can find some clarification as to what I may be doing > wrong here. Here is the scenario: > I have two persistent JDOs: Profile, which stores a users profile > information and Event which is a "posting" that a user has created. > This represents a one-to-many relationship (users can create many > events). I have created this as and un-owned one-to-many > releationship. This is actually a one-to-zero-or-more relationship as > users are able to create a profile with out having to create a > cooresponding event. > > This has been done so that I can query for events seperately from > retrieving profile information. It seems overkill to return all events > everytime I request a user profile. > > Here is the Profile object: > @PersistenceCapable(identityType = IdentityType.APPLICATION) > public class Profile{ > > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > private Key key; > @Persistent > private Email email; > @Persistent > private ShortBlob password; > @Persistent > private Date created; > @Persistent(mappedBy = "profile") > private List<Location> locations; > @Persistent > private Blob logo; > @Persistent > private PhoneNumber phone; > @Persistent > private String phoneid; > @Persistent > private String twitterid; > //Followed by appropriate getters and setters. > > Here is the Event Object: > @PersistenceCapable(identityType = IdentityType.APPLICATION) > public class Event { > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > private Key key; > @Persistent > private Profile author; > @Persistent > private String title; > @Persistent > private Text description; > @Persistent > private Location location; > @Persistent > private Date created; > @Persistent > private Date start; > @Persistent > private Date end; > @Persistent > private Text promomsg; > //followed by appropriate getters and setters. > > I am attempting to perform the following steps: > 1. User registers with email and a profile object is persisted. This > appears to be workign with all other fields persisted as null. I have > left the key field null as well and allowed the system to generate an > id (which appears to be workign correctly). > 2. The profile object is stored in a session and a profile.jsp page is > displayed. > 3. The profile.jsp calls a class which performs various queries on > behalf of the jsp. In this case a query to return the total count of > events created by the user. In this use case the correct number should > be 0 as the user has not created any events. > > The method which is called is: > public Integer EventCount(Profile p) > { > Query query = pm.newQuery(Event.class); > query.setFilter("author == authorParam"); > query.declareParameters("Profile authorParam"); > query.setResult("count(this)"); > int count = 0; > try { > count = (Integer) query.execute(p); > return count; > } finally { > pm.close(); > } > > } > during the execution of query.execute(p) the following exception is > thrown: > ov 5, 2009 8:37:40 PM com.google.apphosting.utils.jetty.JettyLogger > warn > WARNING: Nested in org.apache.jasper.JasperException: > javax.jdo.JDOFatalUserException: SELECT count(this) FROM > apps.youzat.server.Event WHERE author == authorParam PARAMETERS > Profile authorParam: Key of parameter value does not have a parent. > NestedThrowables: > org.datanucleus.exceptions.NucleusUserException: SELECT count(this) > FROM apps.youzat.server.Event WHERE author == authorParam PARAMETERS > Profile authorParam: Key of parameter value does not have a parent.: > javax.jdo.JDOFatalUserException: SELECT count(this) FROM > apps.youzat.server.Event WHERE author == authorParam PARAMETERS > Profile authorParam: Key of parameter value does not have a parent. > at > org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException > (NucleusJDOHelper.java:354) > at org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:252) > at apps.youzat.server.EventService.EventCount(EventService.java:46) > at org.apache.jsp.profile.Profile_jsp._jspService(Profile_jsp.java: > 82) > at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) > at org.apache.jasper.servlet.JspServletWrapper.service > (JspServletWrapper.java:324) > at org.apache.jasper.servlet.JspServlet.serviceJspFile > (JspServlet.java:292) > at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236) > at com.google.appengine.tools.development.PrivilegedJspServlet.access > $101(PrivilegedJspServlet.java:23) > at com.google.appengine.tools.development.PrivilegedJspServlet$2.run > (PrivilegedJspServlet.java:59) > at java.security.AccessController.doPrivileged(Native Method) > at com.google.appengine.tools.development.PrivilegedJspServlet.service > (PrivilegedJspServlet.java:57) > 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.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:54) > at org.mortbay.jetty.handler.HandlerWrapper.handle > (HandlerWrapper.java:139) > at com.google.appengine.tools.development.JettyContainerService > $ApiProxyHandler.handle(JettyContainerService.java:342) > 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 am at a loss for what is causign this. Can anyone help me understand > where my error in logic is here? > > Thank you in advance, > > Corey --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
