hahaha, no that doesn't sound draconian. I remember reading that the ordering of lists can be a performance hit, I haven't bothered to look too deep into it yet (since I'm only doing a proof of concept right now). I have some questions about it though. For instance, what if I were to order by some kind of displayOrder field that I maintain? Would that also suffer a performance lag? I mainly want to move to the GAE for performance and scalability, so I think I'd appreciate a runtime/compile time warning that told me about things I was doing that would hurt my performance.
Thanks again for helping me out so much. -bryce On Mon, Dec 14, 2009 at 9:06 PM, Max Ross (Google) <maxr+appeng...@google.com> wrote: > Ok I've got good news for you. I need to do more testing but I think > different parent types for child objects should work fine as long as you use > list-ordering for your one-to-many relationships, which you really ought to > be doing anyway. Position properties are already incredibly inefficient, > and it turns out the bug you're running into only applies when there are > position properties in play. You can read more about it in this section: > http://code.google.com/appengine/docs/java/datastore/relationships.html#Owned_One_to_Many_Relationships > (How Ordered Collections Maintain Their Order). > > So, if you change your one-to-many relationship on RatePlan to: > @Persistent > @Order(extensions = @Extension(vendorName="datanucleus", > key="list-ordering", value="id")) > private List<RatePlan> ratePlans = new ArrayList<RatePlan>(); > > you should be in business. > > Position properties are so bad I'm considering turning them into a meta-data > error that you have to explicitly silence with a jvm property. What do you > think, too draconian? > > Max > > On Mon, Dec 14, 2009 at 11:09 AM, Max Ross (Google) > <maxr+appeng...@google.com> wrote: >> >> Sure, sorry it was such a headache for you. When I've got a fix ready >> I'll let you know. >> >> On Mon, Dec 14, 2009 at 10:57 AM, bryce cottam <bcot...@gmail.com> wrote: >>> >>> good point, I kinda got lost in the exceptions I was getting :) >>> I wound up sorting it out by making an embedded class instead of >>> having multiple parent classes for a given child class. Although, it >>> would be nice if a child class could have different parent types. >>> >>> Thanks for all your help Max. >>> -bryce >>> >>> >>> On Mon, Dec 14, 2009 at 11:30 AM, Max Ross (Google) >>> <maxr+appeng...@google.com> wrote: >>> > I believe the exception you're getting is the result of having multiple >>> > parents for the same type, and unfortunately that bug isn't fixed in >>> > this >>> > release. The bugs fixed in this release are: >>> > >>> > - Incorrect exception for multiple fields of same type >>> > http://code.google.com/p/datanucleus-appengine/issues/detail?id=172 >>> > >>> > - Non-persistent base classes do not work >>> > http://code.google.com/p/datanucleus-appengine/issues/detail?id=169 >>> > >>> > - Relationships in abstract base classes don't work >>> > http://code.google.com/p/datanucleus-appengine/issues/detail?id=171 >>> > >>> > >>> > On Sat, Dec 12, 2009 at 1:09 AM, bryce cottam <bcot...@gmail.com> >>> > wrote: >>> >> >>> >> hmmm.... I think I may have installed the patch wrong perhaps. I >>> >> still get the same error. >>> >> I'm using the same code I sent you for the test case Max. Do you see >>> >> any tell-tale signs in here that indicate I've mis-configured >>> >> something? I have datanucleus-appengine-1.0.4.1-RC2.jar on my >>> >> classpath and I removed the previous one (pretty much the same jar but >>> >> with .final.jar as it's name. I followed the steps outlined by >>> >> Jonathan. >>> >> >>> >> here is the stack trace: >>> >> java.lang.ClassCastException: oid is not instanceof >>> >> javax.jdo.identity.ObjectIdentity >>> >> at >>> >> com.resmark.model.RatePlan.jdoCopyKeyFieldsFromObjectId(RatePlan.java) >>> >> at >>> >> >>> >> org.datanucleus.store.mapped.mapping.PersistenceCapableMapping.setObjectAsValue(PersistenceCapableMapping.java:657) >>> >> at >>> >> >>> >> org.datanucleus.store.mapped.mapping.PersistenceCapableMapping.setObject(PersistenceCapableMapping.java:364) >>> >> at >>> >> >>> >> org.datanucleus.store.appengine.DatastoreRelationFieldManager$1.setObjectViaMapping(DatastoreRelationFieldManager.java:128) >>> >> at >>> >> >>> >> org.datanucleus.store.appengine.DatastoreRelationFieldManager$1.apply(DatastoreRelationFieldManager.java:104) >>> >> at >>> >> >>> >> org.datanucleus.store.appengine.DatastoreRelationFieldManager.storeRelations(DatastoreRelationFieldManager.java:78) >>> >> at >>> >> >>> >> org.datanucleus.store.appengine.DatastoreFieldManager.storeRelations(DatastoreFieldManager.java:812) >>> >> at >>> >> >>> >> org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPostProcess(DatastorePersistenceHandler.java:288) >>> >> at >>> >> >>> >> org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java:241) >>> >> at >>> >> >>> >> org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:225) >>> >> 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.resmark.JdoTestServlet.create(JdoTestServlet.java:183) >>> >> at com.resmark.JdoTestServlet.doTest(JdoTestServlet.java:90) >>> >> at com.resmark.JdoTestServlet.doGet(JdoTestServlet.java:33) >>> >> at javax.servlet.http.HttpServlet.service(HttpServlet.java:693) >>> >> 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: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've got to be missing something. :( >>> >> >>> >> thanks, >>> >> -bryce >>> >> >>> >> >>> >> On Fri, Dec 11, 2009 at 8:54 AM, bryce cottam <bcot...@gmail.com> >>> >> wrote: >>> >> > Thanks a million Max, I've been on the road for a few days but I'm >>> >> > looking >>> >> > forward to trying this out when I get back. Thanks for the link >>> >> > Jonathan. >>> >> > >>> >> > -bryce >>> >> > >>> >> > On Dec 11, 2009 6:50 AM, "Jonathan 'J5' Cook" >>> >> > <jonathan.j5.c...@gmail.com> wrote: >>> >> > >>> >> > Thanks for the fix, Max and perfect timing for me :) I just >>> >> > upgraded >>> >> > to 1.2.8 and started having this issue last night. >>> >> > >>> >> > For those who don't/didn't already know (like myself), here is a >>> >> > link >>> >> > to instructions Max wrote on how to install a new plugin version >>> >> > into >>> >> > the SDK: >>> >> > >>> >> > >>> >> > >>> >> > http://code.google.com/p/datanucleus-appengine/wiki/HowToUpdateTheSDKWithANewPluginVersion >>> >> > >>> >> > Regards, >>> >> > J5 >>> >> > >>> >> > On Dec 10, 11:59 am, "Max Ross (Google)" <maxr+appeng...@google.com> >>> >> > wrote: >>> >> >> I've posted a bug fix release candidate containing this fix >>> >> >> >>> >> >> >>> >> >> here:http://datanucleus-appengine.googlecode.com/files/appengine-orm-1.0.4... >>> >> > >>> >> >> > On Tue, Dec 8, 2009 at 5:26 PM, bryce cottam <bcot...@gmail.com> >>> >> >> > wrote: >>> >> >> > > > That's great news Ma... >>> >> > >>> >> >> > On Dec 8, 2009 5:20 PM, "Max Ross (Google)" >>> >> >> > <maxr+appeng...@google.com<maxr%2bappeng...@google.com>> >>> >> > >>> >> >> > wrote: > > > I've filed bug > >>> >> >> > >>> >> >> > > >http://code.google.com/p/datanucleus-appengine/issues/detail?id=1... >>> >> > >>> >> >> > On Tue, Dec 8, 2009 at 11:29 AM, bryce cottam <bcot...@gmail.com> >>> >> >> > wrote: >>> >> >> > > > >> > > It's all goo... >>> >> > >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com> >>> >> > >>> >> >> > . > > For more options, visit this group at > >>> >> >> > >http://groups.google.com/group/google-appengine-j... >>> >> >>> >> -- >>> >> >>> >> 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. >>> >> >>> >> >>> > >>> > -- >>> > >>> > 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. >>> > >>> >>> -- >>> >>> 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. >>> >>> >> > > -- > > 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. > -- 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.