Anybody? On Mar 23, 7:57 pm, tempy <[email protected]> wrote: > MODEL OBJECTS: > > @PersistenceCapable(detachable = "true") > @FetchGroup(name = "children", members = { @Persistent(name = > "_Children") }) > public class Parent { > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > private Key _ID; > > @Persistent > private String _Name; > > @Persistent(mappedBy = "_Parent") > @Element(dependent = "true") > private Set<Child> _Children = new HashSet<Child>(); > > public Parent(Key ID, String Name) > { > _ID = ID; > _Name = Name; > } > > //Getters removed > > } > > @PersistenceCapable(detachable = "true") > public class Child { > @PrimaryKey > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > private Key _ID; > > @Persistent > private Parent _Parent; > > @Persistent > private Key _ParentKey; > > @Persistent > private String _Value; > > public Child(Key ID, Parent parent, String value) > { > _ID = ID; > _ParentKey = parent.GetID(); > _Parent = parent; > } > > } > > TEST CODE: > private static PersistenceManagerFactory _pmf = null; > > public String greetServer(String input) throws > IllegalArgumentException { > if(_pmf == null) > _pmf = > JDOHelper.getPersistenceManagerFactory("transactions- > optional"); > > Key parentKey = > KeyFactory.createKey(Parent.class.getSimpleName(), > "abc"); //We only ever create one parent object and then retrieve it > ArrayList<Key> keyList = new ArrayList<Key>(); > keyList.add(parentKey); > > List<Parent> p = FetchAndDetachParent(keyList); > if(p == null) > { > Parent pt = new Parent(parentKey, "hello"); > ArrayList<Parent> list = new ArrayList<Parent>(); > list.add(pt); > AddOrAttachParent(list); > } > else //If the parent has already been created, add children > to it > { > String childKeyString = UUID.randomUUID().toString(); > Parent pt = p.get(0); > Key childKey = KeyFactory.createKey(pt.GetID(), > Child.class.getSimpleName(), childKeyString); > Child ch = new Child(childKey, pt, "hello"); > pt.GetChildren().add(ch); > > ArrayList<Parent> list = new ArrayList<Parent>(); > list.add(pt); > AddOrAttachParent(list); > } > > return "all ok"; > } > > public List<Parent> FetchAndDetachParent(List<Key> Keys) > { > PersistenceManager pm = _pmf.getPersistenceManager(); > pm.setDetachAllOnCommit(true); > pm.getFetchPlan().addGroup("children"); > > Transaction tx = pm.currentTransaction(); > > Query query = null; > try { > tx.begin(); > > query = pm.newQuery(Parent.class); > query.setFilter("_ID == :keyList"); > > List<Parent> results = (List<Parent>)query.execute(Keys); > > if(results.size() == 0) > { > tx.commit(); > return null; > } > else > { > tx.commit(); > return results; > } > > } finally { > query.closeAll(); > if (tx.isActive()) > { > tx.rollback(); > } > pm.close(); > } > } > > public void AddOrAttachParent(List<Parent> parents) > { > PersistenceManager pm = _pmf.getPersistenceManager(); > > Transaction tx = pm.currentTransaction(); > try > { > tx.begin(); > //pm.makePersistent(parents.get(0)); > pm.makePersistentAll(parents); //If I comment out > this line and > uncomment the above one, everything is fine. If not, then sometimes > this works, and sometimes it throws. > tx.commit(); > } > finally > { > if (tx.isActive()) > { > tx.rollback(); > } > pm.close(); > } > } > > The exception is as follows: > SEVERE: [1269368147119000] javax.servlet.ServletContext log: Exception > while dispatching incoming RPC call > com.google.gwt.user.server.rpc.UnexpectedException: Service method > 'public abstract java.lang.String > com.mike.test.client.GreetingService.greetServer(java.lang.String) > throws java.lang.IllegalArgumentException' threw an unexpected > exception: javax.jdo.JDOUserException: One or more instances could not > be made persistent > NestedThrowables: > java.lang.NullPointerException > at > com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java: > 378) > at > com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java: > 581) > at > com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServi > ceServlet.java: > 188) > at > com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServi > ceServlet.java: > 224) > at > com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(Abstract > RemoteServiceServlet.java: > 62) > 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.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFi > lter.java: > 51) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1084) > at > com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(Trans > actionCleanupFilter.java: > 43) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1084) > at > com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFile > Filter.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(DevAppEn > gineWebAppContext.java: > 70) > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java: > 139) > at com.google.appengine.tools.development.JettyContainerService > $ApiProxyHandler.handle(JettyContainerService.java:352) > 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) > Caused by: javax.jdo.JDOUserException: One or more instances could not > be made persistent > NestedThrowables: > java.lang.NullPointerException > at > org.datanucleus.jdo.JDOPersistenceManager.makePersistentAll(JDOPersistenceM > anager.java: > 737) > at > org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager.access > $001(DatastoreJDOPersistenceManager.java:39) > at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager > $1.call(DatastoreJDOPersistenceManager.java:100) > at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager > $1.call(DatastoreJDOPersistenceManager.java:99) > at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager > $BatchManagerWrapper.call(DatastoreJDOPersistenceManager.java:125) > at org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager > $BatchManagerWrapper.access$200(DatastoreJDOPersistenceManager.java: > 121) > at > org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManager.makePers > istentAll(DatastoreJDOPersistenceManager.java: > 98) > at > com.mike.test.server.GreetingServiceImpl.AddOrAttachDecks(GreetingServiceIm > pl.java: > 111) > at > com.mike.test.server.GreetingServiceImpl.greetServer(GreetingServiceImpl.ja > va: > 56) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > at java.lang.reflect.Method.invoke(Unknown Source) > at > com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime > .java: > 100) > at > com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java: > 562) > ... 30 more > Caused by: java.lang.NullPointerException > at org.datanucleus.sco.SCOUtils.attachAddNewElements(SCOUtils.java: > 743) > at org.datanucleus.sco.simple.Set.attachCopy(Set.java:234) > at > org.datanucleus.store.fieldmanager.AttachFieldManager.storeObjectField(Atta > chFieldManager.java: > 205) > at > org.datanucleus.state.AbstractStateManager.providedObjectField(AbstractStat > eManager.java: > 1037) > at com.mike.test.server.model.Parent.jdoProvideField(Parent.java) > at com.mike.test.server.model.Parent.jdoProvideFields(Parent.java) > at > org.datanucleus.state.JDOStateManagerImpl.provideFields(JDOStateManagerImpl > .java: > 2715) > at > org.datanucleus.state.JDOStateManagerImpl.internalAttachCopy(JDOStateManage > rImpl.java: > 4055) > at > org.datanucleus.state.JDOStateManagerImpl.attachCopy(JDOStateManagerImpl.ja > va: > 3987) > at > org.datanucleus.ObjectManagerImpl.attachObjectCopy(ObjectManagerImpl.java: > 1778) > at > org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.j > ava: > 1260) > at > org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java: > 1175) > at > org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceM > anager.java: > 669) > at > org.datanucleus.jdo.JDOPersistenceManager.makePersistentAll(JDOPersistenceM > anager.java: > 723) > ... 44 more
-- 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 [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
