You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by "Nikita Timofeev (JIRA)" <ji...@apache.org> on 2017/08/16 07:26:00 UTC

[jira] [Commented] (CAY-2349) Cayenne cache issue: 'SelectQuery' with prefetches loses relationships (null)

    [ https://issues.apache.org/jira/browse/CAY-2349?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16128437#comment-16128437 ] 

Nikita Timofeev commented on CAY-2349:
--------------------------------------

Here is minimal test case that reproduces this (it throws {{NullPointerException}}):
{code}
        tArtist.insert(1, "artist1");
	tPainting.insert(1, "painting1", 1, 0);

        ObjectSelect<Painting> s1 = ObjectSelect.query(Painting.class).sharedCache("g1");
	ObjectSelect<Painting> s2 = ObjectSelect.query(Painting.class).prefetch(Painting.TO_ARTIST.disjoint()).sharedCache("g1");

	List<Painting> paintings = s1.select(context);
	assertEquals(1, paintings.size());
	assertNotNull(paintings.get(0).getToArtist());

	paintings = s2.select(context);
	assertEquals(1, paintings.size());
	assertNotNull(paintings.get(0).getToArtist());
{code}

> Cayenne cache issue: 'SelectQuery' with prefetches loses relationships (null)
> -----------------------------------------------------------------------------
>
>                 Key: CAY-2349
>                 URL: https://issues.apache.org/jira/browse/CAY-2349
>             Project: Cayenne
>          Issue Type: Bug
>          Components: Core Library
>    Affects Versions: 4.0.B1
>         Environment: JCacheModule, ehcache.
>            Reporter: Artyom Kravchenko
>
> 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:
> {code:java}
> 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())
>     }
>     
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)