openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Aleksandar Likic (JIRA)" <>
Subject [jira] Created: (OPENJPA-245) Attach NEW and auto-increment identity
Date Sun, 27 May 2007 14:05:16 GMT
Attach NEW and auto-increment identity

                 Key: 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 {

  private long id;

  public long getId() {

  public void setId(long 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="" xmlns:xsi=""

    <persistence-unit name="example" transaction-type="RESOURCE_LOCAL">

        <!-- We must enumerate each entity in the persistence unit -->


            <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"/>
------------ persistence.xml (END) ------------------------------
------------ orm.xml (START) ------------------------------
<entity-mappings xmlns="" 
    xsi:schemaLocation=" orm_1_0.xsd"
    <entity class="example.Consumer">
            <id name="id">
                <generated-value strategy="IDENTITY"/>
            <basic name="firstName">
                <column name="first_name"/>
            <basic name="lastName">
                <column name="last_name"/>
------------ orm.xml (END) ------------------------------

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

View raw message