Details

    • Type: Sub-task Sub-task
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.0.3, 1.0.4, 1.1.0, 1.1.1, 1.2.0, 1.2.1, 1.3.0, 2.0.0-M2
    • Fix Version/s: 1.3.0, 2.0.0-M2
    • Component/s: kernel
    • Labels:
      None

      Description

      In some use case, an unexpected pre/postUpdate callback event will be fired.

      The following operations demonstrate the scenario:

      em.getTransaction().begin();
      // Create and persist a new Message entity
      Message message = new Message("Hello Persistence!");
      message.setId(1);
      em.persist(message);
      em.flush();
      // Create and persist another new Message entity
      message = new Message("Hello Persistence 2!");
      message.setId(2);
      em.persist(message);
      em.getTransaction().commit();

      em.getTransaction().begin();
      message.setMessage("Mutated 2!!");
      em.getTransaction().commit();

        • PrePersist - Message: id=1, m=Hello Persistence!, create=null, updated=null, v=null
        • PostPersist - Message: id=1, m=Hello Persistence!, create=null, updated=null, v=1
        • PrePersist - Message: id=2, m=Hello Persistence 2!, create=null, updated=null, v=null
        • PreUpdate - Message: id=1, m=Hello Persistence!, create=null, updated=null, v=1
        • PostPersist - Message: id=2, m=Hello Persistence 2!, create=null, updated=null, v=1
        • PostUpdate - Message: id=1, m=Hello Persistence!, create=null, updated=null, v=1
        • PreUpdate - Message: id=2, m=Mutated 2!!, create=null, updated=null, v=1
        • PostUpdate - Message: id=2, m=Mutated 2!!, create=null, updated=null, v=2

      Albert Lee.

        Issue Links

          Activity

          Hide
          Albert Lee added a comment -

          The problem is in the condition when the pre/postUpdate events are fired. Specifically in

          StateManagerImpl
          void preFlush(boolean logical, OpCallbacks call)

          { ...... else if (!(isNew() && !isFlushed())) fireLifecycleEvent(LifecycleEvent.BEFORE_UPDATE); }

          The condition reflects the condition when an Insert is NOT performed as determined in

          AbstractUpdateManager
          protected Collection populateRowManager(.....) {
          .......
          if (sm.getPCState() == PCState.PNEW && !sm.isFlushed())

          { insert(sm, (ClassMapping) sm.getMetaData(), rowMgr, store, customs); }

          else if (sm.getPCState() == PCState.PNEWFLUSHEDDELETED

          sm.getPCState() == PCState.PDELETED) { delete(sm, (ClassMapping) sm.getMetaData(), rowMgr, store, customs); }

          else if ((dirty = ImplHelper.getUpdateFields(sm)) != null)

          { update(sm, dirty, (ClassMapping) sm.getMetaData(), rowMgr, store, customs); }

          else if (sm.isVersionUpdateRequired()) {

          Therefore the pre/postUpdate should be fired only if an additionally condition if the update is performed. i.e. ImplHelper.getUpdateFields(sm) != null.

          Albert Lee.

          Show
          Albert Lee added a comment - The problem is in the condition when the pre/postUpdate events are fired. Specifically in StateManagerImpl void preFlush(boolean logical, OpCallbacks call) { ...... else if (!(isNew() && !isFlushed())) fireLifecycleEvent(LifecycleEvent.BEFORE_UPDATE); } The condition reflects the condition when an Insert is NOT performed as determined in AbstractUpdateManager protected Collection populateRowManager(.....) { ....... if (sm.getPCState() == PCState.PNEW && !sm.isFlushed()) { insert(sm, (ClassMapping) sm.getMetaData(), rowMgr, store, customs); } else if (sm.getPCState() == PCState.PNEWFLUSHEDDELETED sm.getPCState() == PCState.PDELETED) { delete(sm, (ClassMapping) sm.getMetaData(), rowMgr, store, customs); } else if ((dirty = ImplHelper.getUpdateFields(sm)) != null) { update(sm, dirty, (ClassMapping) sm.getMetaData(), rowMgr, store, customs); } else if (sm.isVersionUpdateRequired()) { Therefore the pre/postUpdate should be fired only if an additionally condition if the update is performed. i.e. ImplHelper.getUpdateFields(sm) != null. Albert Lee.
          Hide
          ASF subversion and git services added a comment -

          Commit 1517039 from Heath Thomann in branch 'openjpa/branches/1.2.x'
          [ https://svn.apache.org/r1517039 ]

          OPENJPA-754: Add additional condition to determine if the pre/postUpdate callback should be called - back ported to 1.2.x Albert Lee's trunk changes.

          Show
          ASF subversion and git services added a comment - Commit 1517039 from Heath Thomann in branch 'openjpa/branches/1.2.x' [ https://svn.apache.org/r1517039 ] OPENJPA-754 : Add additional condition to determine if the pre/postUpdate callback should be called - back ported to 1.2.x Albert Lee's trunk changes.

            People

            • Assignee:
              Albert Lee
              Reporter:
              Albert Lee
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development