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.


Reply via email to