[appengine-java] Re: Bulk update throws exception
Hi Anita. I don't understand your data model -- if you are modeling the relationship between entities of type A and entities of type B using entities of type C, why do entities of type A have direct references to entities of type B and vice versa? Either way, the reason you're getting this error is because you're inadvertently attempting to set an owned relationship between entities of types A and B under type C, and doing this tries to modify the keys of types A and B after they've been persisted, which you can't do. Try changing the following: @PersistenceCapable(identityType = IdentityType.APPLICATION) public class TableC implements Serializable{ @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key id; @Persistent private Key tablea; @Persistent private Key tableb; . This should just store a reference to the entity's key (unowned relationship) rather than trying to modify the keys of the A and B entities. - Jason On Tue, Sep 15, 2009 at 1:34 AM, Anita wrote: > > Hi Jason, > > I could solve my previous problem. But now i am facing some other > problem with many to many relationship tables. > > My schema looks as follows: > > TableA ---> TableC <- TableB > which means there is many to many relationship between TableA & > TableB. So i want TableA and TableB primary keys into TableC as > foreign key. > > TableA class looks as follows: > > @PersistenceCapable(identityType = IdentityType.APPLICATION) > public class TableA implements Serializable{ > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > private Key id; > .. > @Persistent(defaultFetchGroup="true") > private Set tableB = new HashSet(); > .. > (some getter & setter) > > TableB class looks as follows: > > @PersistenceCapable(identityType = IdentityType.APPLICATION) > public class TableB implements Serializable{ > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > private Key id; > .. > @Persistent(defaultFetchGroup="true") > private Set tableA = new HashSet(); > .. > (some getter & setter) > > TableC class looks as follows: > @PersistenceCapable(identityType = IdentityType.APPLICATION) > public class TableC implements Serializable{ > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > private Key id; > > @Persistent > private TableA tablea; > > @Persistent > private TableB tableb; > . > (some getter & setter) > > While adding data into TableC i use following code: > > Query query1 = pm.newQuery(TableA.class); > List results1 = (List) query1.execute(); > TableA tableA= results1.get(0); > > Query query2 = pm.newQuery(TableB.class); > List results2 = (List) query2.execute(); > TableB tableB= results2.get(0); > > tableA.add(tableB); > tableB.add(tableA); > > At this point TableA and TableB values are getting update but while > entering data into TableC the problem comes. > TableC tableC = new TableC(); > tableC.setTableA(tableA); > tableC.setTableB(tableB); > pm.makePersistent(tableC); --> at this point it gives me "A parent > cannot be established or changed once an object has been persisted." > > Can you please tell me were i am going wrong? > > Thanks > Anita > > On Sep 15, 3:54 am, "Jason (Google)" wrote: > > From the error message, it sounds like the parent isn't getting set > > correctly. You'll need to share some of your code in order for me to help > > you further -- what does your Release class look like and how are you > > persisting it? > > > > - Jason > > > > On Sat, Sep 12, 2009 at 4:36 AM, Anita wrote: > > > > > Hi Jason, > > > > > Our schema looks as follows: > > > ProductType 1->M Product 1>M Release > > > > > Data is inserting into Release table. But while fetching data from > > > release table i am getting following exception: > > > > > Field com.ensarm.server.domain.Release.products should be able to > > > provide a reference to its parent but the entity does not have a > > > parent. Did you perhaps try to establish an instance of > > > com.ensarm.server.domain.Release as the child of an instance of > > > com.ensarm.server.domain.Products after the child had already been > > > persisted? > > > org.datanucleus.exceptions.NucleusUserException: Field > > > com.ensarm.server.domain.Release.products should be able to provide a > > > reference to its parent but the entity does not have a parent. Did > > > you perhaps try to establish an instance of > > > com.ensarm.server.domain.Release as the child of an instance of > > > com.ensarm.server.domain.Products after the child had already been > > > persisted? > > >at > > > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.lookupParent > > > (DatastoreRelationFieldManager.java:302) > > >at > > > > > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.fetchRelationField > > > (DatastoreRelationFieldManager.java:289) > > >at > > > org.datanucleus.store.appe
[appengine-java] Re: Bulk update throws exception
Hi Jason, I could solve my previous problem. But now i am facing some other problem with many to many relationship tables. My schema looks as follows: TableA ---> TableC <- TableB which means there is many to many relationship between TableA & TableB. So i want TableA and TableB primary keys into TableC as foreign key. TableA class looks as follows: @PersistenceCapable(identityType = IdentityType.APPLICATION) public class TableA implements Serializable{ @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key id; .. @Persistent(defaultFetchGroup="true") private Set tableB = new HashSet(); .. (some getter & setter) TableB class looks as follows: @PersistenceCapable(identityType = IdentityType.APPLICATION) public class TableB implements Serializable{ @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key id; .. @Persistent(defaultFetchGroup="true") private Set tableA = new HashSet(); .. (some getter & setter) TableC class looks as follows: @PersistenceCapable(identityType = IdentityType.APPLICATION) public class TableC implements Serializable{ @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key id; @Persistent private TableA tablea; @Persistent private TableB tableb; . (some getter & setter) While adding data into TableC i use following code: Query query1 = pm.newQuery(TableA.class); List results1 = (List) query1.execute(); TableA tableA= results1.get(0); Query query2 = pm.newQuery(TableB.class); List results2 = (List) query2.execute(); TableB tableB= results2.get(0); tableA.add(tableB); tableB.add(tableA); At this point TableA and TableB values are getting update but while entering data into TableC the problem comes. TableC tableC = new TableC(); tableC.setTableA(tableA); tableC.setTableB(tableB); pm.makePersistent(tableC); --> at this point it gives me "A parent cannot be established or changed once an object has been persisted." Can you please tell me were i am going wrong? Thanks Anita On Sep 15, 3:54 am, "Jason (Google)" wrote: > From the error message, it sounds like the parent isn't getting set > correctly. You'll need to share some of your code in order for me to help > you further -- what does your Release class look like and how are you > persisting it? > > - Jason > > On Sat, Sep 12, 2009 at 4:36 AM, Anita wrote: > > > Hi Jason, > > > Our schema looks as follows: > > ProductType 1->M Product 1>M Release > > > Data is inserting into Release table. But while fetching data from > > release table i am getting following exception: > > > Field com.ensarm.server.domain.Release.products should be able to > > provide a reference to its parent but the entity does not have a > > parent. Did you perhaps try to establish an instance of > > com.ensarm.server.domain.Release as the child of an instance of > > com.ensarm.server.domain.Products after the child had already been > > persisted? > > org.datanucleus.exceptions.NucleusUserException: Field > > com.ensarm.server.domain.Release.products should be able to provide a > > reference to its parent but the entity does not have a parent. Did > > you perhaps try to establish an instance of > > com.ensarm.server.domain.Release as the child of an instance of > > com.ensarm.server.domain.Products after the child had already been > > persisted? > > at > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.lookupParent > > (DatastoreRelationFieldManager.java:302) > > at > > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.fetchRelationField > > (DatastoreRelationFieldManager.java:289) > > at > > org.datanucleus.store.appengine.DatastoreFieldManager.fetchObjectField > > (DatastoreFieldManager.java:271) > > at org.datanucleus.state.AbstractStateManager.replacingObjectField > > (AbstractStateManager.java:1197) > > at com.ensarm.server.domain.Release.jdoReplaceField(Release.java) > > at com.ensarm.server.domain.Release.jdoReplaceFields(Release.java) > > at org.datanucleus.state.JDOStateManagerImpl.replaceFields > > (JDOStateManagerImpl.java:2772) > > at org.datanucleus.state.JDOStateManagerImpl.replaceFields > > (JDOStateManagerImpl.java:2791) > > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject > > (DatastorePersistenceHandler.java:349) > > at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo > > (DatastoreQuery.java:384) > > at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo > > (DatastoreQuery.java:345) > > at org.datanucleus.store.appengine.query.DatastoreQuery.access$700 > > (DatastoreQuery.java:96) > > at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply > > (DatastoreQuery.java:454) > > at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply > > (DatastoreQuery.java:453) > > at
[appengine-java] Re: Bulk update throws exception
nope you are right ... it's not useless ... apologies I *think* the problem is in mapping (conceptually) from a mental RDBMS model to a GAE DS model ... where "entity group" might be mistaken for "table" ... :) On Aug 26, 3:02 pm, "Jason (Google)" wrote: > Why do you indicate that the documentation is useless? The links I included > above state this quite clearly: two entities will be in separate entity > groups by default, even if they're the same kind. Entity groups DO NOT > collect entities of the same kind. If you need transaction support, you'll > need to explicitly set one entity as the parent of the other, which > basically creates a hierarchy (tree) of entities -- this is an entity group. > In JDO/JPA, you do this using owned relationships which is covered in my > second link above. > - Jason > > > > On Tue, Aug 25, 2009 at 2:33 PM, Larry Cable wrote: > > > I have exactly the same problem, I instantiate a number of @Entity > > objects > > (all of the same type) persist them, and flush them in the context of > > the same > > transaction. > > > Since they are all of the same type, and their are no relationships > > (although there is > > an @Embedded class/field) I would imagine that they are all modelled > > as being in the > > same entity group .. but apparently not. > > > The documentation is basically useless at this point ... > > > On Aug 15, 1:09 pm, Foreigner wrote: > > > While trying to do a bulk update on my entities using JPA I get the > > > exception bellow. > > > I understand that you can't do a bulk update on different entity groups > > in > > > the same transaction but I guess I don't quite understand what an entity > > > group is and how I go about making all entities part of the same group I > > > want. > > > > Thanks for the help. > > > > fbr > > > > Illegal argument > > > org.datanucleus.exceptions.NucleusUserException: Illegal argument > > > at > > org.datanucleus.store.appengine.DatastoreExceptionTranslator.wrapIllegalArgumentException(DatastoreExceptionTranslator.java:42) > > > at > > org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.put(RuntimeExceptionWrappingDatastoreService.java:106) > > > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:125) > > > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:94) > > > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.updateObject(DatastorePersistenceHandler.java:398) > > > at > > org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4458) > > > at > > org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:2807) > > > at > > org.datanucleus.ObjectManagerImpl.markDirty(ObjectManagerImpl.java:2617) > > > at > > org.datanucleus.state.JDOStateManagerImpl.postWriteField(JDOStateManagerImpl.java:4241) > > > at > > org.datanucleus.state.JDOStateManagerImpl.setObjectField(JDOStateManagerImpl.java:2287) > > > at > > com.yicook.entities.TwitterDailyTip.jdoSetlastSet(TwitterDailyTip.java) > > > at > > com.yicook.entities.TwitterDailyTip.setLastSet(TwitterDailyTip.java:36) > > > at > > com.yicook.control.bco.TwitterStatusSetterBCO.resetTDT(TwitterStatusSetterBCO.java:60) > > > at > > com.yicook.control.bco.TwitterStatusSetterBCO.execute(TwitterStatusSetterBCO.java:40) > > > at > > com.yicook.control.ApplicationController.executeControllers(ApplicationController.java:61) > > > at > > com.yicook.control.ApplicationController.dispatch(ApplicationController.java:41) > > > at > > com.yicook.servlets.FrontController.doPost(FrontController.java:31) > > > at > > com.yicook.servlets.FrontController.doGet(FrontController.java:25) > > > 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 > > 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.goog
[appengine-java] Re: Bulk update throws exception
>From the error message, it sounds like the parent isn't getting set correctly. You'll need to share some of your code in order for me to help you further -- what does your Release class look like and how are you persisting it? - Jason On Sat, Sep 12, 2009 at 4:36 AM, Anita wrote: > > Hi Jason, > > Our schema looks as follows: > ProductType 1->M Product 1>M Release > > Data is inserting into Release table. But while fetching data from > release table i am getting following exception: > > Field com.ensarm.server.domain.Release.products should be able to > provide a reference to its parent but the entity does not have a > parent. Did you perhaps try to establish an instance of > com.ensarm.server.domain.Release as the child of an instance of > com.ensarm.server.domain.Products after the child had already been > persisted? > org.datanucleus.exceptions.NucleusUserException: Field > com.ensarm.server.domain.Release.products should be able to provide a > reference to its parent but the entity does not have a parent. Did > you perhaps try to establish an instance of > com.ensarm.server.domain.Release as the child of an instance of > com.ensarm.server.domain.Products after the child had already been > persisted? >at > org.datanucleus.store.appengine.DatastoreRelationFieldManager.lookupParent > (DatastoreRelationFieldManager.java:302) >at > > org.datanucleus.store.appengine.DatastoreRelationFieldManager.fetchRelationField > (DatastoreRelationFieldManager.java:289) >at > org.datanucleus.store.appengine.DatastoreFieldManager.fetchObjectField > (DatastoreFieldManager.java:271) >at org.datanucleus.state.AbstractStateManager.replacingObjectField > (AbstractStateManager.java:1197) >at com.ensarm.server.domain.Release.jdoReplaceField(Release.java) >at com.ensarm.server.domain.Release.jdoReplaceFields(Release.java) >at org.datanucleus.state.JDOStateManagerImpl.replaceFields > (JDOStateManagerImpl.java:2772) >at org.datanucleus.state.JDOStateManagerImpl.replaceFields > (JDOStateManagerImpl.java:2791) >at > org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject > (DatastorePersistenceHandler.java:349) >at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo > (DatastoreQuery.java:384) >at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo > (DatastoreQuery.java:345) >at org.datanucleus.store.appengine.query.DatastoreQuery.access$700 > (DatastoreQuery.java:96) >at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply > (DatastoreQuery.java:454) >at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply > (DatastoreQuery.java:453) >at > org.datanucleus.store.appengine.query.StreamingQueryResult.resolveNext > (StreamingQueryResult.java:137) >at org.datanucleus.store.appengine.query.StreamingQueryResult > $1.computeNext(StreamingQueryResult.java:163) >at > org.datanucleus.store.appengine.query.AbstractIterator.tryToComputeNext > (AbstractIterator.java:132) >at org.datanucleus.store.appengine.query.AbstractIterator.hasNext > (AbstractIterator.java:127) >at org.datanucleus.store.appengine.query.StreamingQueryResult > $AbstractListIterator.hasNext(StreamingQueryResult.java:229) >at com.ensarm.server.servlet.GetData.getRelease(GetData.java:87) >at com.ensarm.server.servlet.GetData.doGet(GetData.java:32) > 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:124) > 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 > $ApiProxyHandle
[appengine-java] Re: Bulk update throws exception
Hi Jason, Our schema looks as follows: ProductType 1->M Product 1>M Release Data is inserting into Release table. But while fetching data from release table i am getting following exception: Field com.ensarm.server.domain.Release.products should be able to provide a reference to its parent but the entity does not have a parent. Did you perhaps try to establish an instance of com.ensarm.server.domain.Release as the child of an instance of com.ensarm.server.domain.Products after the child had already been persisted? org.datanucleus.exceptions.NucleusUserException: Field com.ensarm.server.domain.Release.products should be able to provide a reference to its parent but the entity does not have a parent. Did you perhaps try to establish an instance of com.ensarm.server.domain.Release as the child of an instance of com.ensarm.server.domain.Products after the child had already been persisted? at org.datanucleus.store.appengine.DatastoreRelationFieldManager.lookupParent (DatastoreRelationFieldManager.java:302) at org.datanucleus.store.appengine.DatastoreRelationFieldManager.fetchRelationField (DatastoreRelationFieldManager.java:289) at org.datanucleus.store.appengine.DatastoreFieldManager.fetchObjectField (DatastoreFieldManager.java:271) at org.datanucleus.state.AbstractStateManager.replacingObjectField (AbstractStateManager.java:1197) at com.ensarm.server.domain.Release.jdoReplaceField(Release.java) at com.ensarm.server.domain.Release.jdoReplaceFields(Release.java) at org.datanucleus.state.JDOStateManagerImpl.replaceFields (JDOStateManagerImpl.java:2772) at org.datanucleus.state.JDOStateManagerImpl.replaceFields (JDOStateManagerImpl.java:2791) at org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject (DatastorePersistenceHandler.java:349) at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo (DatastoreQuery.java:384) at org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo (DatastoreQuery.java:345) at org.datanucleus.store.appengine.query.DatastoreQuery.access$700 (DatastoreQuery.java:96) at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply (DatastoreQuery.java:454) at org.datanucleus.store.appengine.query.DatastoreQuery$5.apply (DatastoreQuery.java:453) at org.datanucleus.store.appengine.query.StreamingQueryResult.resolveNext (StreamingQueryResult.java:137) at org.datanucleus.store.appengine.query.StreamingQueryResult $1.computeNext(StreamingQueryResult.java:163) at org.datanucleus.store.appengine.query.AbstractIterator.tryToComputeNext (AbstractIterator.java:132) at org.datanucleus.store.appengine.query.AbstractIterator.hasNext (AbstractIterator.java:127) at org.datanucleus.store.appengine.query.StreamingQueryResult $AbstractListIterator.hasNext(StreamingQueryResult.java:229) at com.ensarm.server.servlet.GetData.getRelease(GetData.java:87) at com.ensarm.server.servlet.GetData.doGet(GetData.java:32) 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:124) 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:313) 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
[appengine-java] Re: Bulk update throws exception
Why do you indicate that the documentation is useless? The links I included above state this quite clearly: two entities will be in separate entity groups by default, even if they're the same kind. Entity groups DO NOT collect entities of the same kind. If you need transaction support, you'll need to explicitly set one entity as the parent of the other, which basically creates a hierarchy (tree) of entities -- this is an entity group. In JDO/JPA, you do this using owned relationships which is covered in my second link above. - Jason On Tue, Aug 25, 2009 at 2:33 PM, Larry Cable wrote: > > I have exactly the same problem, I instantiate a number of @Entity > objects > (all of the same type) persist them, and flush them in the context of > the same > transaction. > > Since they are all of the same type, and their are no relationships > (although there is > an @Embedded class/field) I would imagine that they are all modelled > as being in the > same entity group .. but apparently not. > > The documentation is basically useless at this point ... > > On Aug 15, 1:09 pm, Foreigner wrote: > > While trying to do a bulk update on my entities using JPA I get the > > exception bellow. > > I understand that you can't do a bulk update on different entity groups > in > > the same transaction but I guess I don't quite understand what an entity > > group is and how I go about making all entities part of the same group I > > want. > > > > Thanks for the help. > > > > fbr > > > > Illegal argument > > org.datanucleus.exceptions.NucleusUserException: Illegal argument > > at > org.datanucleus.store.appengine.DatastoreExceptionTranslator.wrapIllegalArgumentException(DatastoreExceptionTranslator.java:42) > > at > org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.put(RuntimeExceptionWrappingDatastoreService.java:106) > > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:125) > > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:94) > > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.updateObject(DatastorePersistenceHandler.java:398) > > at > org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4458) > > at > org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:2807) > > at > org.datanucleus.ObjectManagerImpl.markDirty(ObjectManagerImpl.java:2617) > > at > org.datanucleus.state.JDOStateManagerImpl.postWriteField(JDOStateManagerImpl.java:4241) > > at > org.datanucleus.state.JDOStateManagerImpl.setObjectField(JDOStateManagerImpl.java:2287) > > at > com.yicook.entities.TwitterDailyTip.jdoSetlastSet(TwitterDailyTip.java) > > at > com.yicook.entities.TwitterDailyTip.setLastSet(TwitterDailyTip.java:36) > > at > com.yicook.control.bco.TwitterStatusSetterBCO.resetTDT(TwitterStatusSetterBCO.java:60) > > at > com.yicook.control.bco.TwitterStatusSetterBCO.execute(TwitterStatusSetterBCO.java:40) > > at > com.yicook.control.ApplicationController.executeControllers(ApplicationController.java:61) > > at > com.yicook.control.ApplicationController.dispatch(ApplicationController.java:41) > > at > com.yicook.servlets.FrontController.doPost(FrontController.java:31) > > at > com.yicook.servlets.FrontController.doGet(FrontController.java:25) > > 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 > 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:306) > > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) > > at org.mortbay.jetty.Server.handle(
[appengine-java] Re: Bulk update throws exception
h' ... so it would seem that 2 or more entity (instances) persisted in the same tx cause this error ... this cannot be so ... how is the mapping from instance to entity (group) made? On Aug 25, 2:33 pm, Larry Cable wrote: > I have exactly the same problem, I instantiate a number of @Entity > objects > (all of the same type) persist them, and flush them in the context of > the same > transaction. > > Since they are all of the same type, and their are no relationships > (although there is > an @Embedded class/field) I would imagine that they are all modelled > as being in the > sameentitygroup.. but apparently not. > > The documentation is basically useless at this point ... > > On Aug 15, 1:09 pm, Foreigner wrote: > > > > > While trying to do a bulk update on my entities using JPA I get the > > exception bellow. > > I understand that you can't do a bulk update on differententitygroups in > > the same transaction but I guess I don't quite understand what anentity > >groupis and how I go about making all entities part of the samegroupI > > want. > > > Thanks for the help. > > > fbr > > > Illegal argument > > org.datanucleus.exceptions.NucleusUserException: Illegal argument > > at > > org.datanucleus.store.appengine.DatastoreExceptionTranslator.wrapIllegalArgumentException(DatastoreExceptionTranslator.java:42) > > at > > org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.put(RuntimeExceptionWrappingDatastoreService.java:106) > > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:125) > > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:94) > > at > > org.datanucleus.store.appengine.DatastorePersistenceHandler.updateObject(DatastorePersistenceHandler.java:398) > > at > > org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4458) > > at > > org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:2807) > > at > > org.datanucleus.ObjectManagerImpl.markDirty(ObjectManagerImpl.java:2617) > > at > > org.datanucleus.state.JDOStateManagerImpl.postWriteField(JDOStateManagerImpl.java:4241) > > at > > org.datanucleus.state.JDOStateManagerImpl.setObjectField(JDOStateManagerImpl.java:2287) > > at > > com.yicook.entities.TwitterDailyTip.jdoSetlastSet(TwitterDailyTip.java) > > at > > com.yicook.entities.TwitterDailyTip.setLastSet(TwitterDailyTip.java:36) > > at > > com.yicook.control.bco.TwitterStatusSetterBCO.resetTDT(TwitterStatusSetterBCO.java:60) > > at > > com.yicook.control.bco.TwitterStatusSetterBCO.execute(TwitterStatusSetterBCO.java:40) > > at > > com.yicook.control.ApplicationController.executeControllers(ApplicationController.java:61) > > at > > com.yicook.control.ApplicationController.dispatch(ApplicationController.java:41) > > at > > com.yicook.servlets.FrontController.doPost(FrontController.java:31) > > at > > com.yicook.servlets.FrontController.doGet(FrontController.java:25) > > 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 > > 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:306) > > 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.pars
[appengine-java] Re: Bulk update throws exception
I have exactly the same problem, I instantiate a number of @Entity objects (all of the same type) persist them, and flush them in the context of the same transaction. Since they are all of the same type, and their are no relationships (although there is an @Embedded class/field) I would imagine that they are all modelled as being in the same entity group .. but apparently not. The documentation is basically useless at this point ... On Aug 15, 1:09 pm, Foreigner wrote: > While trying to do a bulk update on my entities using JPA I get the > exception bellow. > I understand that you can't do a bulk update on different entity groups in > the same transaction but I guess I don't quite understand what an entity > group is and how I go about making all entities part of the same group I > want. > > Thanks for the help. > > fbr > > Illegal argument > org.datanucleus.exceptions.NucleusUserException: Illegal argument > at > org.datanucleus.store.appengine.DatastoreExceptionTranslator.wrapIllegalArgumentException(DatastoreExceptionTranslator.java:42) > at > org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.put(RuntimeExceptionWrappingDatastoreService.java:106) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:125) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:94) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.updateObject(DatastorePersistenceHandler.java:398) > at > org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4458) > at > org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:2807) > at > org.datanucleus.ObjectManagerImpl.markDirty(ObjectManagerImpl.java:2617) > at > org.datanucleus.state.JDOStateManagerImpl.postWriteField(JDOStateManagerImpl.java:4241) > at > org.datanucleus.state.JDOStateManagerImpl.setObjectField(JDOStateManagerImpl.java:2287) > at > com.yicook.entities.TwitterDailyTip.jdoSetlastSet(TwitterDailyTip.java) > at > com.yicook.entities.TwitterDailyTip.setLastSet(TwitterDailyTip.java:36) > at > com.yicook.control.bco.TwitterStatusSetterBCO.resetTDT(TwitterStatusSetterBCO.java:60) > at > com.yicook.control.bco.TwitterStatusSetterBCO.execute(TwitterStatusSetterBCO.java:40) > at > com.yicook.control.ApplicationController.executeControllers(ApplicationController.java:61) > at > com.yicook.control.ApplicationController.dispatch(ApplicationController.java:41) > at com.yicook.servlets.FrontController.doPost(FrontController.java:31) > at com.yicook.servlets.FrontController.doGet(FrontController.java:25) > 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 > 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:306) > 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) > Caused by: java.lang.IllegalArgumentException: can't operate
[appengine-java] Re: Bulk update throws exception
Have you read the documentation on entity groups? http://code.google.com/appengine/docs/python/datastore/keysandentitygroups.html#Entity_Groups_Ancestors_and_Paths http://code.google.com/appengine/docs/java/datastore/relationships.html In JDO/JPA, entity groups are expressed using owned relationships between entities -- in JPA, this would be annotated using @OneToOne, @OneToMany, and so forth. If you have any specific questions after reading through the docs on entity groups and relationships, let me know. - Jason On Sat, Aug 15, 2009 at 1:09 PM, Foreigner wrote: > While trying to do a bulk update on my entities using JPA I get the > exception bellow. > I understand that you can't do a bulk update on different entity groups in > the same transaction but I guess I don't quite understand what an entity > group is and how I go about making all entities part of the same group I > want. > > Thanks for the help. > > fbr > > Illegal argument > org.datanucleus.exceptions.NucleusUserException: Illegal argument > at > org.datanucleus.store.appengine.DatastoreExceptionTranslator.wrapIllegalArgumentException(DatastoreExceptionTranslator.java:42) > > at > org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.put(RuntimeExceptionWrappingDatastoreService.java:106) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:125) > > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:94) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.updateObject(DatastorePersistenceHandler.java:398) > > at > org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4458) > at > org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:2807) > at > org.datanucleus.ObjectManagerImpl.markDirty(ObjectManagerImpl.java:2617) > > at > org.datanucleus.state.JDOStateManagerImpl.postWriteField(JDOStateManagerImpl.java:4241) > at > org.datanucleus.state.JDOStateManagerImpl.setObjectField(JDOStateManagerImpl.java:2287) > at > com.yicook.entities.TwitterDailyTip.jdoSetlastSet(TwitterDailyTip.java) > > at > com.yicook.entities.TwitterDailyTip.setLastSet(TwitterDailyTip.java:36) > at > com.yicook.control.bco.TwitterStatusSetterBCO.resetTDT(TwitterStatusSetterBCO.java:60) > at > com.yicook.control.bco.TwitterStatusSetterBCO.execute(TwitterStatusSetterBCO.java:40) > > at > com.yicook.control.ApplicationController.executeControllers(ApplicationController.java:61) > at > com.yicook.control.ApplicationController.dispatch(ApplicationController.java:41) > at com.yicook.servlets.FrontController.doPost(FrontController.java:31) > > at com.yicook.servlets.FrontController.doGet(FrontController.java:25) > 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 > 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:306) > 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) > Caused by: java.lang.IllegalArgumentExcepti