You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Adam Hardy (JIRA)" <ji...@apache.org> on 2009/02/02 14:31:59 UTC

[jira] Commented: (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:comment-tabpanel&focusedCommentId=12669593#action_12669593 ] 

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

This bug completely disables auditing, or at least auditing based on a "last_modified" timestamp field with an entity listener. 

It prevents users from having pre-persist, pre-update, post-persist and post-update EntityListeners with versioning.

Very surprising that this issue is still outstanding in version 1.2.0 when to my untrained eye it seems as if it's not a difficult fix.

Here are a few of the threads discussing it, none of which give any hint of a fix in the pipeline:

http://n2.nabble.com/Does-anyone-meet-the-conflict-values-in-version-column--tt209013.html#none

http://n2.nabble.com/InvalidStateException%3A-Attempt-to-set-column-%22client.version%22-to-two-different-values-tt210609.html

http://n2.nabble.com/-jira--Created%3A-%28OPENJPA-327%29-EntityListener-that-modify-property-value-of-a-entity%2C-causes-invalid-state-exception-tt215677.html#a215679



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