Uploaded image for project: 'Cayenne'
  1. Cayenne
  2. CAY-2349

Cayenne cache issue: 'SelectQuery' with prefetches loses relationships (null)

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.0.B1
    • 4.0.B2, 4.1.M1
    • Core Library
    • None
    • JCacheModule, ehcache.

    Description

      I have faced with the problem when SelectQuery returns wrong query result: returned object lost some of the relationships - they are null.

      I have used prefetches (to load several number of objects in one go) and shared cache (to put query result to cache). I have found an use case where it always reproduces, see my test:

      class CayenneJCacheTest {
      
          def cayenneRuntime
      
          @Test
          void test() {
              cayenneRuntime = new ServerRuntime("cayenne-project.xml", new JCacheModule())
             //select single artist with limited prefetch graph
              selectFew()
             //do the same query but with additional prefetches
              List<Artist> artists =  selectMore()
             // all actor's paintings has a gallery but it is lost from query result - test failed
              assertNotNull(artists[0].paintings[0].gallery)
          }
      
      
          List<Artist> selectFew() {
              //prefetch artist.paintings only, do not prefetch   artist.paintings.gallery
              ObjectSelect.query(CourseClass)
                      .where(Artist.ID.eq('1001'))
                      .prefetch(Artist.PAINTINGS.joint())
                      .cacheStrategy(QueryCacheStrategy.SHARED_CACHE)
                      .cacheGroup(Artist.class.simpleName)
                      .select(cayenneRuntime.newContext())
          }
          
           List<Artist> selectFew() {
              //prefetch all related objects
              ObjectSelect.query(CourseClass)
                      .where(Artist.ID.eq('1001'))
                      .prefetch(Artist.PAINTINGS.joint())
                      .prefetch(Artist.PAINTINGS.dot(Painting.GALLERY).joint())
                      .cacheStrategy(QueryCacheStrategy.SHARED_CACHE)
                      .cacheGroup(Artist.class.simpleName)
                      .select(cayenneRuntime.newContext())
          }
          
      }
      

      Attachments

        Activity

          People

            ntimofeev Nikita Timofeev
            Artyom Artyom Kravchenko
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: