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.

Reply via email to