Sure,

let me explain the scenario first. I am using JSF2 to build UI. My use
case is, After entering some data and going to admin screen, user will
be able to edit the data and save it back to the back end.
1. User enters some data in the system
2. Open Admin section and Edit the data, When user views the page I
retrieve the entity along with the child and show it in page. Here the
object is getting detached.
2. When user saves the data I am taking the same object with modified
fields and reattaching the entity and saving it.

Here is sample code

@Entity
public class A implements Serializable{

        /**
         *
         */
        private static final long serialVersionUID = 2192320792131938874L;

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Extension(vendorName="datanucleus", key="gae.encoded-pk",
value="true")
        private String id;

        private String variableA;

        @OneToOne(cascade=CascadeType.ALL)
        @JoinColumn(name="b_id")
        private B objectB;

.......
}


@Entity
public class B implements Serializable{

        /**
         *
         */
        private static final long serialVersionUID = -2617459837984530482L;

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Extension(vendorName="datanucleus", key="gae.encoded-pk",
value="true")
        private String id;

        private String valiableB;

        @OneToOne(mappedBy="objectB")
        private A objectA;

........
}


function to test the scenario. This test scenario replicates actual
use case. Say I have a registration page where user will add some
data. this is STEP 1:, then go to an admin page and view the data STEP
2:, make changes and save the data STEP 3: Each step is a separate
function (in reality) and for simplicity I am showing in one function.

public void test(){

                try{
//STEP 1: save the object
                        EntityManager em = EMF.get().createEntityManager();
                        A a = new A();
                        B b = new B();
                        b.setValiableB("variableb");
                        a.setObjectB(b);
                        a.setVariableA("variableA");
                        em.persist(a);
                        em.close();

//STEP 2: retrieve the object to show in JSF page
                        em = EMF.get().createEntityManager();
                        A fromDb = (A) em.createQuery("Select o from A as o 
where
o.variableA= :parm")
                        .setParameter("parm", "variableA").getSingleResult();
                        em.close();

//STEP 3: on update reattach the object and save
                        em = EMF.get().createEntityManager();
                        fromDb.setVariableA("modified after detaching");
                        em.merge(fromDb);
                        em.close();


                }catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                }finally{

                }
        }


ERROR Message
javax.persistence.PersistenceException: Attempt was made to manually
set the id component of a Key primary key.  If you want to control the
value of the primary key, set the name component instead.
        at org.datanucleus.jpa.NucleusJPAHelper.getJPAExceptionForJDOException
(NucleusJPAHelper.java:214)
        at org.datanucleus.jpa.EntityManagerImpl.close(EntityManagerImpl.java:
157)
        at org.datanucleus.store.appengine.jpa.DatastoreEntityManager.close
(DatastoreEntityManager.java:54)
        at com.mycompany.hms.service.TenantService.test(TenantService.java:
158)
        at com.mycompany.web.Registration.testJPA(Registration.java:64)
        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.sun.el.parser.AstValue.invoke(AstValue.java:187)
        at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:
297)
        at com.sun.faces.facelets.el.TagMethodExpression.invoke
(TagMethodExpression.java:98)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke
(MethodBindingMethodExpressionAdapter.java:88)
        at com.sun.faces.application.ActionListenerImpl.processAction
(ActionListenerImpl.java:102)
        at javax.faces.component.UICommand.broadcast(UICommand.java:315)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:
775)
        at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:
943)
        at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute
(ApplyRequestValuesPhase.java:78)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:
118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:310)
        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.content
(HttpConnection.java:844)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)
        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
        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: org.datanucleus.exceptions.NucleusUserException: Attempt
was made to manually set the id component of a Key primary key.  If
you want to control the value of the primary key, set the name
component instead.
        at org.datanucleus.store.appengine.DatastoreFieldManager.storeKeyPK
(DatastoreFieldManager.java:650)
        at
org.datanucleus.store.appengine.DatastoreFieldManager.storeStringPKField
(DatastoreFieldManager.java:515)
        at
org.datanucleus.store.appengine.DatastoreFieldManager.storeStringField
(DatastoreFieldManager.java:421)
        at org.datanucleus.state.AbstractStateManager.providedStringField
(AbstractStateManager.java:1023)
        at com.mycompany.hms.entity.test.A.jdoProvideField(A.java)
        at com.mycompany.hms.entity.test.A.jdoProvideFields(A.java)
        at org.datanucleus.state.JDOStateManagerImpl.provideFields
(JDOStateManagerImpl.java:2715)
        at
org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject
(DatastorePersistenceHandler.java:180)
        at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent
(JDOStateManagerImpl.java:3185)
        at org.datanucleus.state.JDOStateManagerImpl.flush
(JDOStateManagerImpl.java:4513)
        at org.datanucleus.ObjectManagerImpl.flushInternal
(ObjectManagerImpl.java:2814)
        at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:
2754)
        at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:
2893)
        at org.datanucleus.TransactionImpl.internalPreCommit
(TransactionImpl.java:369)
        at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:256)
        at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:
801)
        at org.datanucleus.jdo.JDOPersistenceManager.close
(JDOPersistenceManager.java:271)
        at org.datanucleus.jpa.EntityManagerImpl.close(EntityManagerImpl.java:
153)
        ... 42 more


Hope this helps



On Aug 18, 11:03 pm, "Jason (Google)" <[email protected]> wrote:
> Can you provide the snippet of persistence code that throws the exception?
>
> - Jason
>
> On Mon, Aug 17, 2009 at 6:04 AM, Partha <[email protected]>wrote:
>
>
>
>
>
> > What is the meaning of this message? I get this error while updating
> > Parent
>
> > Attempt was made to manually set the id component of a Key primary
> > key.  If you want to control the value of the primary key, set the
> > name component instead.
>
> > @Entity
> > public class Tenant {
>
> >       �...@version()
> >        private Long version;
> >       �...@id
> >       �...@generatedvalue(strategy = GenerationType.IDENTITY)
> >        private Long tenantId;
>
> >       �...@onetoone(cascade=CascadeType.ALL)
> >        private Contact contact;
> > .......
> > }
>
> > @Entity
> > public class Contact {
>
> >       �...@version
> >        private Long version;
> >       �...@id
> >       �...@generatedvalue(strategy = GenerationType.IDENTITY)
> >        private Key contactId;
> > .....
> > }
--~--~---------~--~----~------------~-------~--~----~
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