RE: [jira] Created: (OPENJPA-245) Attach NEW and auto-increment identity
The entity is using auto-generated identity - please see the attached orm.xml. id name=id generated-value strategy=IDENTITY/ /id I am creating NEW instance and assigning an already existing primary key only to reproduce the problem. The real-life scenario is that a web service performs de-serialization of input XML parameter and, in the process, creates a new instance of an entity that has a primary key that already exists in database (this is done by server-side code generated using WL jwsc ant task from WL 9.2.1). em.merge() apparently doesn't work correctly in this case, since a new record is created in database on commit. Regards, Aleksandar Likic Pinaki Poddar wrote: just create a new instance of an entity, assign an already existing primary key A new record will be created in database, with new, auto-generated primary key. What is the identity mechanicsm used by the entity class? If the entity is using auto-generated identity then assigning an already existing key is not recommneded. If the entity is not using auto-generated, then assigning an existing key *should* fail at commit with duplicate key exception. Pinaki Poddar BEA Systems 415.402.7317 -Original Message- From: Aleksandar Likic (JIRA) [mailto:[EMAIL PROTECTED] Sent: Sunday, May 27, 2007 9:05 AM To: open-jpa-dev@incubator.apache.org Subject: [jira] Created: (OPENJPA-245) Attach NEW and auto-increment identity 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.7, 0.9.6 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 providerorg.apache.openjpa.persistence.PersistenceProviderImpl/provid er !-- We must enumerate each entity in the persistence unit -- classexample.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
[jira] Created: (OPENJPA-245) Attach NEW and auto-increment identity
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.7, 0.9.6 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 providerorg.apache.openjpa.persistence.PersistenceProviderImpl/provider !-- We must enumerate each entity in the persistence unit -- classexample.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.
RE: [jira] Created: (OPENJPA-245) Attach NEW and auto-increment identity
just create a new instance of an entity, assign an already existing primary key A new record will be created in database, with new, auto-generated primary key. What is the identity mechanicsm used by the entity class? If the entity is using auto-generated identity then assigning an already existing key is not recommneded. If the entity is not using auto-generated, then assigning an existing key *should* fail at commit with duplicate key exception. Pinaki Poddar BEA Systems 415.402.7317 -Original Message- From: Aleksandar Likic (JIRA) [mailto:[EMAIL PROTECTED] Sent: Sunday, May 27, 2007 9:05 AM To: open-jpa-dev@incubator.apache.org Subject: [jira] Created: (OPENJPA-245) Attach NEW and auto-increment identity 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.7, 0.9.6 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 providerorg.apache.openjpa.persistence.PersistenceProviderImpl/provid er !-- We must enumerate each entity in the persistence unit -- classexample.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. Notice: This email message, together with any attachments, may contain information of BEA Systems, Inc., its subsidiaries