Now I'm starting to suspect something funny going on with your config. I received a TransactionNotActiveException when I tried to run your code without starting the txn, and the fact that you didn't receive that exception doesn't make any sense to me. I can't explain why you see the exception and I don't. The best thing would be for you to put together a stripped down test case that demonstrates the problem. An actual unit test would be ideal, but if you're not a position to write one then just a simple standalone servlet should suffice.
Thanks, Max On Tue, Dec 1, 2009 at 1:00 PM, bryce cottam <bcot...@gmail.com> wrote: > that is both a type-o and it was missing :) It was missing from my > test code, but it was present in my "real" code. So, after putting > the tx.begin() in the test code, I get the exact same behavior as the > "real" code (i.e. nothing gets written to the datastore and I get the > exception. Sorry about missing that in the code I posted. > > I'm kinda lost on where to go with this and where to look. I did > notice that the code actually prompts the exception is in the > datanucleus core and there is a comment above it that says: > / TODO Factor out this PersistenceCapable reference > ((PersistenceCapable)value).jdoCopyKeyFieldsFromObjectId(new > AppIDObjectIdFieldConsumer(param, om, ps, > javaTypeMappings), id); > > so, I'm not sure if this has soemthing to do with code style > datanucleus is trying to phase out or what? Again, I'm not gonna be > shocked if I'm missing something though. > thanks! > -bryce > > > On Tue, Dec 1, 2009 at 1:53 PM, Max Ross (Google) > <maxr+appeng...@google.com <maxr%2bappeng...@google.com>> wrote: > > 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<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.