openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Pinaki Poddar" <ppod...@bea.com>
Subject RE: [jira] Updated: (OPENJPA-327) EntityListener that modify property value of a entity, causes invalid state exception
Date Wed, 22 Aug 2007 21:25:25 GMT
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.

Mime
View raw message