openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Adam Hardy (JIRA)" <j...@apache.org>
Subject [jira] Commented: (OPENJPA-327) EntityListener that modify property value of a entity, causes invalid state exception
Date Sat, 21 Feb 2009 20:24:01 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-327?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12675594#action_12675594
] 

Adam Hardy commented on OPENJPA-327:
------------------------------------

I see it with mySQL and Derby. 


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


Mime
View raw message