Hi Yu,

This is not expected behavior. You should be able to detach and merge your
entity into a new persistence context.

The error you're getting is because you have a value specified in a
"GeneratedField" (ie in your entity you have @GeneratedValue on the field).
The field in question is Policy.id (sounds like your Primary Key).. Have you
modified this field after closign the original context?

If not then it's probably a case of OpenJPA not realizing that the field was
loaded (ie not set after detaching). Did you serialize the entity after
closing the original context (if so there are other properties that you may
need to set).

-mike

On Tue, Jul 14, 2009 at 3:21 AM, wang yu <[email protected]> wrote:

> Hello,
> I uses OpenJPA 1.2.1.
> Even if I add @Version annotation for the entity class,It doesn't work.
> Every time the merge method is used, OpenJPA try to insert a new row
> into database.
>
> So, is it a expected behavior of OpenJPA? Merge method cannot attach a
> detached entity into a new context?
>
> Regards,
> Yu Wang
>
> On Mon, Jul 13, 2009 at 5:44 PM, wang yu<[email protected]> wrote:
> > Hello,
> > My case is:
> > 1. Find an entity and close the context.
> > 2. Update it with user input.
> > 3. Create a new EntityManager and try to merge it into new context.
> >
> > Then the following exception was thrown:
> >
> > <openjpa-1.2.1-r752877:753278 nonfatal user error>
> > org.apache.openjpa.persistence.InvalidStateException: The generated
> > value processing detected an existing value assigned to this field:
> > com.XXX.bean.Policy.id.  This existing value was either provided via
> > an initializer or by calling the setter method.  You either need to
> > remove the @GeneratedValue annotation or modify the code to remove the
> > initializer processing.
> >
>  org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:483)
> >
>  org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:463)
> >
>  
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:744)
> >
>  
> org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:134)
> >
>  
> org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:134)
> >
>  
> org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:520)
> >
>  
> org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2824)
> >        org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:39)
> >
>  
> org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:960)
> >        org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1948)
> >
>  org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1908)
> >
>  org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1826)
> >
>  
> org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
> >        org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1350)
> >
>  org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:877)
> >
>  
> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:512)
> >        com.XXX.dao.DAOContainer.commitTransaction(DAOContainer.java:195)
> >
>  com.XXX.policy.PolicyServiceImpl.update(PolicyServiceImpl.java:272)
> >        com.XXX.ds.ServletIndex.doGet(ServletIndex.java:78)
> >        javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
> >        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
> >
> > What's the root cause of this exception?
> > Thanks!
> >
> > Regards,
> > Yu Wang
> >
>

Reply via email to