openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Pinaki Poddar <ppod...@apache.org>
Subject Re: [jira] Commented: (OPENJPA-327) EntityListener that modify property value of a entity, causes invalid state exception
Date Sun, 22 Feb 2009 02:44:39 GMT

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 jira@apache.org 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.


Mime
View raw message