You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Michael Dick (JIRA)" <ji...@apache.org> on 2009/07/09 17:02:14 UTC
[jira] Assigned: (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:all-tabpanel ]
Michael Dick reassigned OPENJPA-327:
------------------------------------
Assignee: Michael Dick
> 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
> Assignee: Michael Dick
> Attachments: OPENJPA327-1.0.patch, OPENJPA327-1.2.patch, 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.