OpenJPA
  1. OpenJPA
  2. OPENJPA-2107

ManagedCache conflict due adding an entity 2 times in the same query.

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 2.0.1, 2.1.0, 2.2.0
    • Fix Version/s: 1.2.3, 2.0.2, 2.1.2, 2.2.0
    • Component/s: kernel
    • Labels:
      None

      Description

      I have a complex query which creates the following error:

      <openjpa-2.2.0-tiss-2-rexported nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Cannot load object with id "26301". Instance "at.ac.tuwien.tiss.curriculum.be.entities.DefaultCourse@6e267b76" with the same id already exists in the L1 cache. This can occur when you assign an existing id to a new instance, and before flushing attempt to load the existing instance for that id.
      FailedObject: at.ac.tuwien.tiss.curriculum.be.entities.DefaultCourse-26301
      at org.apache.openjpa.kernel.ManagedCache.add(ManagedCache.java:126)
      at org.apache.openjpa.kernel.BrokerImpl.setStateManager(BrokerImpl.java:4117)
      at org.apache.openjpa.kernel.StateManagerImpl.initialize(StateManagerImpl.java:391)
      at org.apache.openjpa.kernel.StateManagerImpl.initialize(StateManagerImpl.java:340)
      at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.initializeState(JDBCStoreManager.java:378)

      It seems that this entity gets loaded from the db twice in the same query.

      While hitting the problem, the StateManagers have the following _flags:

      orig _flags= 602 = 0010 0101 1010 SAVE LOADED READ_LOCKED OID_ASSIGNED FLUSHED
      sm _flags= 16 = 0000 0001 0000 READ_LOCKED

      And it is really only 1 instance which makes this problem. If I set the 'orig' variable to null in the debugger, the test runs fine.

        Issue Links

          Activity

          Mark Struberg created issue -
          Hide
          Mark Struberg added a comment -

          I now locally reproduced this with a simple Entity. The problematic pattern is to create an entity instance, em.persist it and do a query containing this new entity in the same transaction! The effect only appears if other entities exists which would be returned by the query.

          em.getTransaction().begin();
          
          Semester sem = new Semester();
          sem.setYear(2120);
          sem.setSeason(SemesterDTO.Season.S);
          em.persist(sem);
          
          Query q = em.createQuery("select s from Semester as s where s.season=:season", Semester.class);
          q.setParameter("season", SemesterDTO.Season.S);
          List<Semester> semesters = q.getResultList();
          Assert.assertTrue(semesters.size() > 1); <-- this line crashes!
          

          I'm currently using the following properties in our persistence.xml

          <property name="openjpa.DynamicEnhancementAgent" value="false"/>

          <!-- disable prepared statement caching -->
          <property name="openjpa.jdbc.QuerySQLCache" value="false"/>

          <property name="openjpa.DataCache" value="false"/>

          <property name="openjpa.Log" value="log4j"/>
          <property name="openjpa.PostLoadOnMerge" value="true" />
          <property name="openjpa.DetachState" value="loaded(DetachedStateField=true)"/>
          <property name="openjpa.Compatibility" value="IgnoreDetachedStateFieldForProxySerialization=true"/>

          <property name="openjpa.jdbc.MappingDefaults"
          value="ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict"/>

          <!-- use class per table strategy -->
          <property name="openjpa.Sequence" value="class-table(Table=SEQUENCES, Increment=20, InitialValue=10000)"/>

          Show
          Mark Struberg added a comment - I now locally reproduced this with a simple Entity. The problematic pattern is to create an entity instance, em.persist it and do a query containing this new entity in the same transaction! The effect only appears if other entities exists which would be returned by the query. em.getTransaction().begin(); Semester sem = new Semester(); sem.setYear(2120); sem.setSeason(SemesterDTO.Season.S); em.persist(sem); Query q = em.createQuery( "select s from Semester as s where s.season=:season" , Semester.class); q.setParameter( "season" , SemesterDTO.Season.S); List<Semester> semesters = q.getResultList(); Assert.assertTrue(semesters.size() > 1); <-- this line crashes! I'm currently using the following properties in our persistence.xml <property name="openjpa.DynamicEnhancementAgent" value="false"/> <!-- disable prepared statement caching --> <property name="openjpa.jdbc.QuerySQLCache" value="false"/> <property name="openjpa.DataCache" value="false"/> <property name="openjpa.Log" value="log4j"/> <property name="openjpa.PostLoadOnMerge" value="true" /> <property name="openjpa.DetachState" value="loaded(DetachedStateField=true)"/> <property name="openjpa.Compatibility" value="IgnoreDetachedStateFieldForProxySerialization=true"/> <property name="openjpa.jdbc.MappingDefaults" value="ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict"/> <!-- use class per table strategy --> <property name="openjpa.Sequence" value="class-table(Table=SEQUENCES, Increment=20, InitialValue=10000)"/>
          Hide
          Rick Curtis added a comment -

          Mark -

          It looks like we put this bug in with OPENJPA-2051. Give this patch a try.

          Note, I haven't had time to try to run this patch through the entire test bucket yet.

          Show
          Rick Curtis added a comment - Mark - It looks like we put this bug in with OPENJPA-2051 . Give this patch a try. Note, I haven't had time to try to run this patch through the entire test bucket yet.
          Rick Curtis made changes -
          Field Original Value New Value
          Attachment OPENJPA-2107.patch [ 12510384 ]
          Hide
          Mark Struberg added a comment -

          Tested and verified. Looks good - txs 4 this quick patch!
          Can you please commit it?

          Show
          Mark Struberg added a comment - Tested and verified. Looks good - txs 4 this quick patch! Can you please commit it?
          Hide
          Rick Curtis added a comment -

          I'll need to spend a few more cycles tomorrow to make sure this isn't going to introduce any other problems... if all goes well, I'll get it in tomorrow afternoon.

          Show
          Rick Curtis added a comment - I'll need to spend a few more cycles tomorrow to make sure this isn't going to introduce any other problems... if all goes well, I'll get it in tomorrow afternoon.
          Hide
          Mark Struberg added a comment -

          Yes. We also must make a unit test which fails before we apply the patch and works afterwards!

          Show
          Mark Struberg added a comment - Yes. We also must make a unit test which fails before we apply the patch and works afterwards!
          Rick Curtis made changes -
          Assignee Mark Struberg [ struberg ] Rick Curtis [ curtisr7 ]
          Rick Curtis made changes -
          Link This issue relates to OPENJPA-2051 [ OPENJPA-2051 ]
          Hide
          Rick Curtis added a comment -

          This bug was introduced by OPENJPA-2051

          Show
          Rick Curtis added a comment - This bug was introduced by OPENJPA-2051
          Hide
          Rick Curtis added a comment -

          Committed revision 1231375 to trunk.

          The root issue is that we only need to reset the Broker flag which indicates if the context has been flushed when we are initializing a new StateManager.

          I'm going to leave this issue Open (and assign it to Heath) as it needs to get fixed in 2.0.x and 2.1.x.

          Show
          Rick Curtis added a comment - Committed revision 1231375 to trunk. The root issue is that we only need to reset the Broker flag which indicates if the context has been flushed when we are initializing a new StateManager. I'm going to leave this issue Open (and assign it to Heath) as it needs to get fixed in 2.0.x and 2.1.x.
          Hide
          Rick Curtis added a comment -

          Updated fix and affects version.

          Show
          Rick Curtis added a comment - Updated fix and affects version.
          Rick Curtis made changes -
          Assignee Rick Curtis [ curtisr7 ] Heath Thomann [ jpaheath ]
          Affects Version/s 2.1.0 [ 12314542 ]
          Affects Version/s 2.0.1 [ 12314532 ]
          Albert Lee made changes -
          Status Open [ 1 ] Resolved [ 5 ]
          Resolution Fixed [ 1 ]
          Albert Lee made changes -
          Status Resolved [ 5 ] Closed [ 6 ]
          Heath Thomann made changes -
          Resolution Fixed [ 1 ]
          Status Closed [ 6 ] Reopened [ 4 ]
          Heath Thomann made changes -
          Status Reopened [ 4 ] Resolved [ 5 ]
          Fix Version/s 1.2.3 [ 12314517 ]
          Fix Version/s 2.0.2 [ 12315257 ]
          Fix Version/s 2.1.2 [ 12317142 ]
          Resolution Fixed [ 1 ]
          Heath Thomann made changes -
          Status Resolved [ 5 ] Closed [ 6 ]

            People

            • Assignee:
              Heath Thomann
              Reporter:
              Mark Struberg
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development