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> 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> 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.
>> >> 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.


Reply via email to