I just ran the test on trunk with Auto generation strategy against Derby. The test ran -- i should not say pass -- because it does not assert anything and I did not step through the test to see what is the tester's expectation -- but it ran without any runtime exception.
All the callbacks was fired as per the System.out statements. Pinaki Poddar wrote: > > Hi, > I ran it with Oracle because the test uses Database's native Sequence > generation capability. > Can you please describe what exactly you do on MySQL side to make the > test run with MySQL which afaik do not have a native sequence generator > such as in Oracle. > I will run the test the with other generation strategy against MySQL -- > but my guess is this failure has got something to do with generation > strategy being used and how a particular database handles it. And hence I > did not modify that aspect of the test classses. > > > > > JIRA [email protected] wrote: >> >> >> [ >> 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. >> >> >> > > -- View this message in context: http://n2.nabble.com/-jira--Created%3A-%28OPENJPA-327%29-EntityListener-that-modify-property-value-of-a-entity%2C-causes-invalid-state-exception-tp215677p2366110.html Sent from the OpenJPA Developers mailing list archive at Nabble.com.
