EntityListener that modify property value of a entity, causes invalid state 
exception
-------------------------------------------------------------------------------------

                 Key: OPENJPA-327
                 URL: https://issues.apache.org/jira/browse/OPENJPA-327
             Project: OpenJPA
          Issue Type: Bug
          Components: jpa
    Affects Versions: 1.0.0
         Environment: windows xp, jdk 5
code was build time enhanced
            Reporter: Henry Lai


entitylistener callback that modifies property value of the entity throws 
exception

The following test code produces the following exception

<1.0.0-SNAPSHOT-SNAPSHOT fatal user error> 
org.apache.openjpa.persistence.InvalidStateException: Attempt to set column 
"T1ENTITY.VER_ID" to two different values: (class java.lang.Integer)"2", (class 
java.lang.Integer)"3" This can occur when you fail to set both sides of a 
two-sided relation between objects, or when you map different fields to the 
same column, but you do not keep the values of these fields in synch.
        at org.apache.openjpa.jdbc.sql.PrimaryRow.setObject(PrimaryRow.java:338)
        at org.apache.openjpa.jdbc.sql.RowImpl.setObject(RowImpl.java:505)


        /**
         * for entity with version field, and if the lifecycle listener such as
         * pre-persist, post-persist handler modifies the entity
         * then when flush is invoke, results in optimistic lock exception
         * 
         * this test failes in openjpa 0.9.6
         * this test failes in openjpa 0.9.7
         * this test failes in openjpa 1.0.0
         * 
         * This test case will past with either of following changes
         * 1) comment out em.flush();
         * 2) uncomment <post-update method-name="postUpdate"/> in the orm.xml 
file 
         *
         */

        public void testMultipleInsertWithEntityListener(){
                
                PersistenceProviderImpl openJPA = new PersistenceProviderImpl();
                EntityManagerFactory factory = 
                        openJPA.createEntityManagerFactory("test", 
"ptp/test/issue1/persistence.xml",
                                                System.getProperties() );
                
        EntityManager em = factory.createEntityManager();
        em.getTransaction().begin();
        T1Entity e1 = new T1Entity();           
        T1Entity e2 = new T1Entity();           
        e1.setName("Mickey");
        e2.setName("Goofy");
        
        em.persist(e1);
        em.flush();                     // works if this line is commented out
        
        em.persist(e2);
        em.getTransaction().commit();
        em.close();
        }





package ptp.test.issue1;

import java.sql.Timestamp;

public class T1EntityListener {

  static int count;
  int instNum;

  public T1EntityListener() {
         instNum = count++;
    System.out.println("T1EntityListener=" + this + ", instance=" + instNum );
  }

  public void preUpdate(Object entity) {
    audit( "preUpdate", entity);
  }

  public void postUpdate(Object entity) {
    audit( "postUpdate", entity);
  }

  public void prePersist(Object entity) {
            audit( "prePersist", entity);
          }

          public void postPersist(Object entity) {
            audit( "postPersist", entity);
          }

  public void audit(String eventName, Object entity) {
    if (entity instanceof IAudit) {
      IAudit auditEntity = (IAudit) entity;
      System.out.println("****T1EntityListener inst=" + instNum + ", event=" + 
eventName + ", entity=" + auditEntity + ", ver=" + auditEntity.getVerId());

      try {
        auditEntity.setModifyDateTime(createTimeStamp());
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
  }
  
  private Timestamp createTimeStamp() {
            return new Timestamp(System.currentTimeMillis());
          }




-- 
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