Re: Exception of merge method.

2009-07-14 Thread Michael Dick
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 wangy...@gmail.com 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 yuwangy...@gmail.com 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
 



Re: Exception of merge method.

2009-07-14 Thread wang yu
Hi mike,
Yes, id field with @GeneratedValue(strategy=GenerationType.AUTO)
annotation  is the primary key field and I didn't serialize the
entity.
I just modified some fields of the entity in the same VM and try to
merge the entity into a new context.

Regards,
Yu Wang

On Tue, Jul 14, 2009 at 9:38 PM, Michael Dickmichael.d.d...@gmail.com wrote:
 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 wangy...@gmail.com 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 yuwangy...@gmail.com 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