You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Henry Lai (JIRA)" <ji...@apache.org> on 2007/08/22 23:08:30 UTC

[jira] Updated: (OPENJPA-327) EntityListener that modify property value of a entity, causes invalid state exception

     [ https://issues.apache.org/jira/browse/OPENJPA-327?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Henry Lai updated OPENJPA-327:
------------------------------

    Attachment: ptpissue1.zip

test case and mapping files to reproduce bug

> 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
>         Attachments: ptpissue1.zip
>
>
> 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.


RE: [jira] Updated: (OPENJPA-327) EntityListener that modify property value of a entity, causes invalid state exception

Posted by Pinaki Poddar <pp...@bea.com>.
What happens if the entity is modified/audited in preUpdate? preUpdate
is more appropriate for the nature of operation because by the time
postUpdate callbck the data has been flushed.  

Pinaki Poddar
972.834.2865

-----Original Message-----
From: Henry Lai (JIRA) [mailto:jira@apache.org] 
Sent: Wednesday, August 22, 2007 4:09 PM
To: dev@openjpa.apache.org
Subject: [jira] Updated: (OPENJPA-327) EntityListener that modify
property value of a entity, causes invalid state exception


     [
https://issues.apache.org/jira/browse/OPENJPA-327?page=com.atlassian.jir
a.plugin.system.issuetabpanels:all-tabpanel ]

Henry Lai updated OPENJPA-327:
------------------------------

    Attachment: ptpissue1.zip

test case and mapping files to reproduce bug

> 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
>         Attachments: ptpissue1.zip
>
>
> 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.


Notice:  This email message, together with any attachments, may contain information  of  BEA Systems,  Inc.,  its subsidiaries  and  affiliated entities,  that may be confidential,  proprietary,  copyrighted  and/or legally privileged, and is intended solely for the use of the individual or entity named in this message. If you are not the intended recipient, and have received this message in error, please immediately return this by email and then delete it.