PLEASE HELP?§

On Nov 27, 2:28 pm, clement boret <[email protected]> wrote:
> hello.
> I have a problem when trying to update an object that has already been
> saved in the dataStore....
> An Employee and Contactnfo.  One employee has a contactInfo...
>
> /////////////////////////////////////////////////////////////////////////// 
> ///////////
> /////////////////////////////////////////////////////////////////////////// 
> ///////////
> /////////////////////////////////////////////////////////////////////////// 
> ///////////
> @PersistenceCapable(detachable = "true")
> public class Employee implements Serializable {
>
>   @PrimaryKey
>   @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
>   private Key key;
>
>   @Persistent
>   private ContactInfo contactInfo = null;
>
>   public ContactInfo getContactInfo() {
>     return contactInfo;
>   }
>
>   public void setContactInfo(ContactInfo contactInfo) {
>     this.contactInfo = contactInfo;
>   }
>
>   public Key getKey() {
>     return key;
>   }}
>
> /////////////////////////////////////////////////////////////////////////// 
> ///////////
> /////////////////////////////////////////////////////////////////////////// 
> ///////////
> /////////////////////////////////////////////////////////////////////////// 
> ///////////
> @PersistenceCapable(detachable = "true")
> public class ContactInfo implements Serializable {
>
>   @PrimaryKey
>   @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
>   private Key key;
>
>   @Persistent
>   private String name;
>
>   public String getName() {
>     return name;
>   }
>
>   public void setName(String name) {
>     this.name = name;
>   }
>
>   public Key getKey() {
>     return key;
>   }
>
>   public void setKey(Key key) {
>     this.key = key;
>   }}
>
> /////////////////////////////////////////////////////////////////////////// 
> ///////////
> /////////////////////////////////////////////////////////////////////////// 
> ///////////
> /////////////////////////////////////////////////////////////////////////// 
> ///////////
> my servlet:
>
> public class GreetingServiceImpl extends RemoteServiceServlet
> implements GreetingService {
>
>   private static final PersistenceManagerFactory pmfInstance =
> JDOHelper.getPersistenceManagerFactory("transactions-optional");
>
>   public String greetServer(String input) {
>     String result = "";
>
>     //step1 create and save an employee in the datastore.
>     Key key = storeEmployeeInDatastore();
>
>     //step2 retrieve the employee from the datastore and detach it
>     Employee detachedEmployee = getDetachedEmployee(key);
>
>     //step3 modify the detached employee
>     ContactInfo contactInfo2 = new ContactInfo();
>     detachedEmployee.setContactInfo(contactInfo2);
>
>     //step4 save the modified employee...
>     updateEmployeeInDataStore(detachedEmployee);
>
>     return result;
>   }
>
>   /**
>    * @return the key of the employee that has been stored
>    */
>   private Key storeEmployeeInDatastore() {
>     Employee employee = new Employee();
>     ContactInfo contactInfo = new ContactInfo();
>     employee.setContactInfo(contactInfo);
>
>     //creates a new manager.
>     PersistenceManager manager1 = pmfInstance.getPersistenceManager();
>     Key key = null;
>
>     try {
>       manager1.makePersistent(employee);
>       key = employee.getKey();
>     }
>     catch ( Exception e ) {
>       e.printStackTrace();
>     }
>     finally {
>       //equivalent to manager1.close()
>       manager1.close();
>     }
>     return key;
>   }
>
>   private Employee getDetachedEmployee(Key key) {
>     PersistenceManager manager2 = pmfInstance.getPersistenceManager();
>     Employee attached = manager2.getObjectById(Employee.class, key);
>
>     Employee detachedEmployee = manager2.detachCopy(attached);
>     manager2.close();
>     return detachedEmployee;
>   }
>
>   private void updateEmployeeInDataStore(Employee detachedEmployee) {
>     PersistenceManager manager3 = pmfInstance.getPersistenceManager();
>     try {
>
>       Employee bidon = manager3.makePersistent(detachedEmployee);
>
>       System.out.println("");
>     }
>     catch ( Exception e ) {
>       e.printStackTrace();
>     }
>     finally {
>       manager3.close();
>     }
>   }
>
> }
>
> /////////////////////////////////////////////////////////////////////////// 
> ////////
> /////////////////////////////////////////////////////////////////////////// 
> ////////
> /////////////////////////////////////////////////////////////////////////// 
> ////////
> HERE IS THE ERROR I GET
> org.datanucleus.store.appengine.DatastoreRelationFieldManager
> $ChildWithoutParentException: Detected attempt to establish
> Employee(4) as the parent of ContactInfo(6) but the entity identified
> by ContactInfo(6) has already been persisted without a parent.  A
> parent cannot be established or changed once an object has been
> persisted.
>         at
> org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(Nuc 
> leusJDOHelper.java:
> 354)
>         at
> org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java:
> 281)
>         at
> com.gae.server.GreetingServiceImpl.updateEmployeeInDataStore(GreetingServic 
> eImpl.java:
> 85)
>         at
> com.gae.server.GreetingServiceImpl.greetServer(GreetingServiceImpl.java:
> 33)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
> 39)
>         at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp 
> l.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:
> 562)
>
> /////////////////////////////////////////////////////////////////////////// 
> /////////////
>
> Can Anyone explain me what's wrong... and can anyone explain to me how
> I can do the 4 steps!
>
>     //step1 create and save an employee in the datastore.
>
>     //step2 retrieve the employee from the datastore and detach it
>
>     //step3 modify the detached employee
>
>     //step4 save the modified employee...
>
> Thank you in advance.

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

Reply via email to