[ 
https://issues.apache.org/jira/browse/OPENJPA-245?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12499851
 ] 

Pinaki Poddar commented on OPENJPA-245:
---------------------------------------


merge() to identify that the the merged entity instance is not *truely* new but 
a version of a instance that is already persistent, the entity requires a 
version field.
If the merged instance was a clone created out of serialization and 
desrialization, then OpenJPA will maintain the required bits to identify the 
difference between a truly new instance and an instance that has been detached.



> Attach NEW and auto-increment identity
> --------------------------------------
>
>                 Key: OPENJPA-245
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-245
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jpa
>    Affects Versions: 0.9.6, 0.9.7
>         Environment: jdk1.5.0_11, Win XP, Fedora Core 6, Postgres 8.1 (on 
> Fedora)
>            Reporter: Aleksandar Likic
>
> According to documentation (1.2 Attach Behavior), when an entity instance is 
> NEW (never detached):
>     * If neither of the above cases apply, OpenJPA will check to see if an 
> instance with the same primary key values exists in the database. If so, the 
> object is considered detached. Otherwise, it is considered new.
> This doesn't work for me - a new record in database is created on commit 
> instead of updating the existing one. The "regular" case - 
> detach/modify/attach works fine - the existing record is updated.
> It is very easy to reproduce - just create a new instance of an entity, 
> assign an already existing primary key, call em.merge() and commit. A new 
> record will be created in database, with new, auto-generated primary key.
> I stumbled on this trying to implement a web service that uses OpenJPA-based 
> backend. When servicing an "update" request, the web service instantiates a 
> NEW object (by performing XML de-serialization) and calls em.merge to update 
> the entity. A new record gets created instead of updating an existing one.
> ------------ Entity class (START) ------------------------------
> package exaple;
> public class Consumer implements java.io.Serializable {
>   private long id;
>   public long getId() {
>     return this.id;
>   }
>   public void setId(long id) {
>     this.id = id;
>   }
>   private java.lang.String firstName;
>   public java.lang.String getFirstName() {
>     return this.firstName;
>   }
>   public void setFirstName(java.lang.String firstName) {
>     this.firstName = firstName;
>   }
>   private java.lang.String lastName;
>   public java.lang.String getLastName() {
>     return this.lastName;
>   }
>   public void setLastName(java.lang.String lastName) {
>     this.lastName = lastName;
>   }
> ------------ Entity class (END) ------------------------------
> ------------ persistence.xml (START) ------------------------------
> <?xml version="1.0" encoding="UTF-8"?>
> <persistence xmlns="http://java.sun.com/xml/ns/persistence"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; version="1.0">
>     <persistence-unit name="example" transaction-type="RESOURCE_LOCAL">
>     
>         
> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
>         <!-- We must enumerate each entity in the persistence unit -->
>         <class>example.Consumer</class>
>         <properties>
>             <property name="openjpa.jdbc.DBDictionary" value="postgres"/>
>             <property name="openjpa.ConnectionDriverName" 
> value="org.postgresql.Driver"/>
>             <property name="openjpa.ConnectionUserName" value="app_user"/>
>             <property name="openjpa.ConnectionPassword" value="app_user"/>
>             <property name="openjpa.ConnectionURL" 
> value="jdbc:postgresql://localhost/alikic"/>
>             <property name="openjpa.Log" value="DefaultLevel=WARN,SQL=TRACE"/>
>             
>         </properties>
>     </persistence-unit>
>     
> </persistence>
> ------------ persistence.xml (END) ------------------------------
> ------------ orm.xml (START) ------------------------------
> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"; 
>     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
>     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
> orm_1_0.xsd"
>     version="1.0">
>     <entity class="example.Consumer">
>         <attributes>
>             <id name="id">
>                 <generated-value strategy="IDENTITY"/>
>             </id>
>             <basic name="firstName">
>                 <column name="first_name"/>
>             </basic>
>             <basic name="lastName">
>                 <column name="last_name"/>
>             </basic>
>         </attributes>
>     </entity>
> </entity-mappings>
> ------------ orm.xml (END) ------------------------------

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to