[ https://issues.apache.org/jira/browse/OPENJPA-327?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12672539#action_12672539 ] Pinaki Poddar commented on OPENJPA-327: --------------------------------------- This test case passes with Oracle on trunk version of OpenJPA. > 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 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.