OpenJPA
  1. OpenJPA
  2. OPENJPA-327

EntityListener that modify property value of a entity, causes invalid state exception

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.0.0
    • Fix Version/s: None
    • Component/s: jpa
    • Labels:
      None
    • Environment:
      windows xp, jdk 5
      code was build time enhanced

      Description

      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()); }
      1. OPENJPA327-1.0.patch
        22 kB
        B.J. Reed
      2. OPENJPA327-1.2.patch
        22 kB
        B.J. Reed
      3. ptpissue1.zip
        4 kB
        Henry Lai

        Issue Links

          Activity

          Hide
          Henry Lai added a comment -

          test case and mapping files to reproduce bug

          Show
          Henry Lai added a comment - test case and mapping files to reproduce bug
          Hide
          Adam Hardy added a comment -

          This bug completely disables auditing, or at least auditing based on a "last_modified" timestamp field with an entity listener.

          It prevents users from having pre-persist, pre-update, post-persist and post-update EntityListeners with versioning.

          Very surprising that this issue is still outstanding in version 1.2.0 when to my untrained eye it seems as if it's not a difficult fix.

          Here are a few of the threads discussing it, none of which give any hint of a fix in the pipeline:

          http://n2.nabble.com/Does-anyone-meet-the-conflict-values-in-version-column--tt209013.html#none

          http://n2.nabble.com/InvalidStateException%3A-Attempt-to-set-column-%22client.version%22-to-two-different-values-tt210609.html

          http://n2.nabble.com/-jira--Created%3A-%28OPENJPA-327%29-EntityListener-that-modify-property-value-of-a-entity%2C-causes-invalid-state-exception-tt215677.html#a215679

          Show
          Adam Hardy added a comment - This bug completely disables auditing, or at least auditing based on a "last_modified" timestamp field with an entity listener. It prevents users from having pre-persist, pre-update, post-persist and post-update EntityListeners with versioning. Very surprising that this issue is still outstanding in version 1.2.0 when to my untrained eye it seems as if it's not a difficult fix. Here are a few of the threads discussing it, none of which give any hint of a fix in the pipeline: http://n2.nabble.com/Does-anyone-meet-the-conflict-values-in-version-column--tt209013.html#none http://n2.nabble.com/InvalidStateException%3A-Attempt-to-set-column-%22client.version%22-to-two-different-values-tt210609.html http://n2.nabble.com/-jira--Created%3A-%28OPENJPA-327%29-EntityListener-that-modify-property-value-of-a-entity%2C-causes-invalid-state-exception-tt215677.html#a215679
          Hide
          Pinaki Poddar added a comment -

          This test case passes with Oracle on trunk version of OpenJPA.

          Show
          Pinaki Poddar added a comment - This test case passes with Oracle on trunk version of OpenJPA.
          Hide
          Adam Hardy added a comment -

          I see it with mySQL and Derby.

          Show
          Adam Hardy added a comment - I see it with mySQL and Derby.
          Hide
          B.J. Reed added a comment -

          This test case is working in trunk. Looks like the fix for https://issues.apache.org/jira/browse/OPENJPA-732 will work for this. The above is the change to BrokerImpl and the test case....slight changes in what worked on trunk and the patch for 1.0.x and 1.2.x.

          Show
          B.J. Reed added a comment - This test case is working in trunk. Looks like the fix for https://issues.apache.org/jira/browse/OPENJPA-732 will work for this. The above is the change to BrokerImpl and the test case....slight changes in what worked on trunk and the patch for 1.0.x and 1.2.x.
          Hide
          Michael Dick added a comment -

          Hi B.J. I'm going to reattach your patches to OPENJPA-732 and apply the fix under that JIRA. It's a shame that we didn't mark 732 as a duplicate of this one when we first fixed it but I don't want to have two separate issues which essentially fix the same problem (just different releases). It'll be a little easier to just track the single issue (at least for me).

          Thanks for the patches though!

          Show
          Michael Dick added a comment - Hi B.J. I'm going to reattach your patches to OPENJPA-732 and apply the fix under that JIRA. It's a shame that we didn't mark 732 as a duplicate of this one when we first fixed it but I don't want to have two separate issues which essentially fix the same problem (just different releases). It'll be a little easier to just track the single issue (at least for me). Thanks for the patches though!
          Hide
          Michael Dick added a comment -

          Linking to OPENJPA-732 which contains the fix for this issue.

          Show
          Michael Dick added a comment - Linking to OPENJPA-732 which contains the fix for this issue.
          Hide
          Michael Dick added a comment -

          Resolved under OPENJPA-732.

          Show
          Michael Dick added a comment - Resolved under OPENJPA-732 .

            People

            • Assignee:
              Michael Dick
              Reporter:
              Henry Lai
            • Votes:
              3 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development