I don't see a call to tx.begin() in the code below. Is that a typo or is it actually missing?
On Tue, Dec 1, 2009 at 12:29 PM, bryce cottam <bcot...@gmail.com> wrote: > thanks so much for checking into this Max. > > The data that I'm saving is user generated, so there's not a set > script for it. Conceptually what I'm doing is this: > > Bundle bundle = new Bundle(); > > bundle.setName("My Bundle"); > bundle.setDescription(new > com.google.appengine.api.datastore.Text("My Description")); > bundle.setPricingModel(PricingModel.PER_GUEST); > > RatePlan ratePlan = new RatePlan(); > ratePlan.setPricingModel(PricingModel.PER_GUEST); > ratePlan.setAdultPrice(new java.math.BigDecimal("300.00")); > ratePlan.setYouthPrice(new java.math.BigDecimal("275.00")); > > bundle.setRatePlan(ratePlan); > > List<Key> activityIds = getActivityIds(); > int i = 0; > for (Key id : activityIds) { > BundledActivity bundledActivity = new > BundledActivity(); > bundledActivity.setDay(++i); > > ActivityFK activityFk = new ActivityFK(); > activityFk.setKey(id); > activityFk.setName("activity " + i); > activityFk.setPricingModel(PricingModel.PER_GUEST); > > bundledActivity.setActivity(activityFk); > > RatePlan activityRate = new RatePlan(); > > activityRate.setPricingModel(PricingModel.PER_GUEST); > activityRate.setAdultPrice(new > java.math.BigDecimal("150.00")); > activityRate.setYouthPrice(new > java.math.BigDecimal("120.00")); > > bundledActivity.setRatePlan(activityRate); > bundle.getActivities().add(bundledActivity); > } > > PersistenceManager pm = PMF.createManager(); > Transaction tx = pm.currentTransaction(); > > try { > bundle = pm.makePersistent(bundle); > tx.commit(); > } > finally { > if (tx.isActive()) { > tx.rollback(); > } > > pm.close(); > } > > I get the Bundle saved just fine, but when it tries to save it's child > BundledActivity instances, it breaks. However, when I do the same > thing through the UI of my app, I get the error when attempting to > save the Bundle (i.e. nothing gets written to the datastore, where as > in this test code above, the parent Bundle is getting written, but > none of it's children are getting written). > > Of course anytime I post my code, I kind of summarize, there are > utilities that I use etc. But I am able to reproduce the issue > without using any of my "helper" apis. I am completely open to just > sending you my code (it's all proof of concept right now, so no > disclosure issues) and you can see how all the pieces I'm using are > fitting together. > > I appreciate you taking a look at this, I'd love to know if I'm doing > something wrong. > thanks, > -bryce > > > > On Tue, Dec 1, 2009 at 11:03 AM, Max Ross (Google) > <maxr+appeng...@google.com <maxr%2bappeng...@google.com>> wrote: > > Hi Bryce, > > > > Thanks for posting your model objects. I'm not able to reproduce the > > exception you're reporting, but then again I'm just guessing at how > you're > > populating your objects and persisting them. Here's what I did: > > > > Bundle b = new Bundle(); > > RatePlan rp = new RatePlan(); > > rp.setPricingModel(PricingModel.BOTH); > > b.setRatePlan(rp); > > b.setPricingModel(PricingModel.PER_GUEST); > > BundledActivity ba = new BundledActivity(); > > ba.setDay(3); > > ActivityFK activityFK = new ActivityFK(); > > activityFK.setName("harold"); > > activityFK.setPricingModel(PricingModel.PER_UNIT); > > ba.setActivity(activityFK); > > RatePlan anotherRatePlan = new RatePlan(); > > ba.setRatePlan(anotherRatePlan); > > b.getActivities().add(ba); > > beginTxn(); > > pm.makePersistent(b); > > commitTxn(); > > > > If you can tell me how what you're doing differs from what I'm doing I > can > > investigate further. > > > > Thanks, > > Max > > > > On Mon, Nov 30, 2009 at 5:34 PM, bcottam <bcot...@gmail.com> wrote: > >> > >> no one has any ideas on this? > >> > >> I'd really like to know if this is just a bug that will be resolved > >> (in which case I'll continue to use this data model) or if there is a > >> flaw in my data model/JDO usage. > >> > >> thanks! > >> -bryce > >> > >> > >> > >> On Nov 30, 1:21 am, bcottam <bcot...@gmail.com> wrote: > >> > I'm trying to save some data in my app, quite similar to almost all > >> > other data I've previously saved. However, I'm now getting this stack > >> > trace: > >> > > >> > java.lang.ClassCastException: oid is not instanceof > >> > javax.jdo.identity.ObjectIdentity > >> > at > >> > com.resmark.client.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:132) > >> > at > org.datanucleus.store.appengine.DatastoreRelationFieldManager > >> > $1.apply(DatastoreRelationFieldManager.java:108) > >> > at > >> > > >> > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.storeRelations > >> > (DatastoreRelationFieldManager.java:80) > >> > at > >> > org.datanucleus.store.appengine.DatastoreFieldManager.storeRelations > >> > (DatastoreFieldManager.java:795) > >> > 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.server.model.service.BaseDataService.create > >> > (BaseDataService.java:227) > >> > at com.resmark.server.SetupServiceImpl.updateOrCreate > >> > (SetupServiceImpl.java:120) > >> > at com.resmark.server.SetupServiceImpl.updateOrCreateBundle > >> > (SetupServiceImpl.java:67) > >> > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > >> > at sun.reflect.NativeMethodAccessorImpl.invoke > >> > (NativeMethodAccessorImpl.java:39) > >> > at sun.reflect.DelegatingMethodAccessorImpl.invoke > >> > (DelegatingMethodAccessorImpl.java:25) > >> > at java.lang.reflect.Method.invoke(Method.java:597) > >> > at > >> > com.google.appengine.tools.development.agent.runtime.Runtime.invoke > >> > (Runtime.java:100) > >> > at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse > >> > (RPC.java:527) > >> > at > >> > com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall > >> > (RemoteServiceServlet.java:166) > >> > at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost > >> > (RemoteServiceServlet.java:86) > >> > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:713) > >> > 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.content > >> > (HttpConnection.java:844) > >> > at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644) > >> > 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 seen this come up when a data model has a many-to-one > >> > relationship and a one-to-one relationship with the same data type, > >> > but I'm not doing that. > >> > > >> > here is the code referenced: > >> > @PersistenceCapable(identityType=IdentityType.APPLICATION) > >> > public class Bundle implements Serializable { > >> > @PrimaryKey > >> > @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY) > >> > private Key id; > >> > > >> > @Persistent > >> > private String name; > >> > @Persistent > >> > private Text description; > >> > > >> > @Persistent > >> > private RatePlan ratePlan; > >> > @Persistent > >> > private PricingModel pricingModel; > >> > > >> > @Persistent > >> > private List<BundledActivity> activities = new > >> > ArrayList<BundledActivity>(); > >> > .... > >> > > >> > } > >> > > >> > @PersistenceCapable(identityType=IdentityType.APPLICATION) > >> > public class RatePlan implements Serializable { > >> > > >> > @PrimaryKey > >> > @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY) > >> > public Key id; > >> > > >> > @Persistent > >> > private String name; > >> > > >> > @Persistent > >> > private BigDecimal adultPrice; > >> > @Persistent > >> > private BigDecimal youthPrice; > >> > @Persistent > >> > private BigDecimal unitPrice; > >> > > >> > @Persistent > >> > private PricingModel pricingModel; > >> > > >> > @Persistent > >> > private boolean active = true; > >> > ..... > >> > > >> > } > >> > > >> > @PersistenceCapable(identityType=IdentityType.APPLICATION) > >> > public class BundledActivity implements Serializable { > >> > > >> > @PrimaryKey > >> > @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY) > >> > private Key id; > >> > > >> > @Embedded > >> > @Persistent > >> > private ActivityFK activity; > >> > @Persistent > >> > private RatePlan ratePlan; > >> > @Persistent > >> > private int day; > >> > > >> > @Persistent > >> > @Extension(vendorName="datanucleus", key="gae.parent-pk", > >> > value="true") > >> > private Key bundleId; > >> > ..... > >> > > >> > } > >> > > >> > @PersistenceCapable(identityType=IdentityType.NONDURABLE) > >> > public class ActivityFK implements Serializable { > >> > > >> > @Persistent > >> > private Key key; > >> > @Persistent > >> > private String name; > >> > @Persistent > >> > private PricingModel pricingModel; > >> > .... > >> > > >> > } > >> > > >> > public enum PricingModel implements Serializable { > >> > PER_GUEST, PER_UNIT, BOTH; > >> > > >> > } > >> > > >> > perhaps there's something I'm missing about the model. I've done > >> > almost the same thing in most of my other data model objects and their > >> > relationships. I think about the only thing that's different here is > >> > the @Extension annotation, but that's not where the error is > >> > happening. Any suggestions would be very welcome. > >> > > >> > Thanks! > >> > -bryce > >> > >> -- > >> > >> 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<google-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<google-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<google-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.