From 0c12f46360402722920d1bac2ea171399c635f86 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Sat, 21 Sep 2019 10:14:32 -0700 Subject: [PATCH 1/2] fix: removed EntityManager.clear() from GraphQLJpaQueryDataFetcher --- .../jpa/query/schema/impl/GraphQLJpaQueryDataFetcher.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaQueryDataFetcher.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaQueryDataFetcher.java index 1d621f9b2..3c36b3124 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaQueryDataFetcher.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaQueryDataFetcher.java @@ -108,10 +108,6 @@ public Object get(DataFetchingEnvironment environment) { queryField = new Field(fieldName, field.getArguments(), recordsSelection.get().getSelectionSet()); - // Let's clear session persistent context to avoid getting stale objects cached in the same session - // between requests with different search criteria. This looks like a Hibernate bug... - entityManager.clear(); - TypedQuery query = getQuery(queryEnvironment, queryField, isDistinct); // Let's apply page only if present From 9e5002bc760e9420f1bcb64726129cea20ed6582 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Sat, 21 Sep 2019 11:10:51 -0700 Subject: [PATCH 2/2] fix(test): added unit tests to try to reproduce stale caching result problem --- .../query/schema/GraphQLExecutorTests.java | 97 ++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java index def5cff7f..5ba8e0a0a 100644 --- a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java +++ b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/GraphQLExecutorTests.java @@ -21,6 +21,7 @@ import static org.assertj.core.util.Lists.list; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -1471,6 +1472,100 @@ public void queryWithEQMatchingCase() { //then: assertThat(result.toString()).isEqualTo(expected); - } + } + + @Test + public void shouldNotReturnStaleCacheResultsFromPreviousQueryForCollectionCriteriaExpression() { + //given: + String query = "query ($genre: Genre) {" + + " Authors(where: { " + + " books: {" + + " genre: {EQ: $genre}" + + " }" + + " }) {" + + " select {" + + " id" + + " name" + + " books {" + + " id" + + " title" + + " genre" + + " }" + + " }" + + " }" + + "}"; + + //when: 1st query + Object result1 = executor.execute(query, Collections.singletonMap("genre", "PLAY")).getData(); + + String expected1 = "{Authors={select=[" + + "{id=4, name=Anton Chekhov, books=[" + + "{id=5, title=The Cherry Orchard, genre=PLAY}, " + + "{id=6, title=The Seagull, genre=PLAY}, " + + "{id=7, title=Three Sisters, genre=PLAY}" + + "]}" + + "]}}"; + + //then: + assertThat(result1.toString()).isEqualTo(expected1); + + //when: 2nd query + Object result2 = executor.execute(query, Collections.singletonMap("genre", "NOVEL")).getData(); + + String expected2 = "{Authors={select=[" + + "{id=1, name=Leo Tolstoy, books=[" + + "{id=2, title=War and Peace, genre=NOVEL}, " + + "{id=3, title=Anna Karenina, genre=NOVEL}" + + "]}" + + "]}}"; + + //then: + assertThat(result2.toString()).isEqualTo(expected2); + } + + @Test + public void shouldNotReturnStaleCacheResultsFromPreviousQueryForEmbeddedCriteriaExpression() { + //given: + String query = "query ($genre: Genre) {" + + " Authors {" + + " select {" + + " id" + + " name" + + " books(where:{ genre: {EQ: $genre} }) {" + + " id" + + " title" + + " genre" + + " }" + + " }" + + " }" + + "}"; + + //when: 1st query + Object result1 = executor.execute(query, Collections.singletonMap("genre", "PLAY")).getData(); + + String expected1 = "{Authors={select=[" + + "{id=4, name=Anton Chekhov, books=[" + + "{id=5, title=The Cherry Orchard, genre=PLAY}, " + + "{id=6, title=The Seagull, genre=PLAY}, " + + "{id=7, title=Three Sisters, genre=PLAY}" + + "]}" + + "]}}"; + + //then: + assertThat(result1.toString()).isEqualTo(expected1); + + //when: 2nd query + Object result2 = executor.execute(query, Collections.singletonMap("genre", "NOVEL")).getData(); + + String expected2 = "{Authors={select=[" + + "{id=1, name=Leo Tolstoy, books=[" + + "{id=2, title=War and Peace, genre=NOVEL}, " + + "{id=3, title=Anna Karenina, genre=NOVEL}" + + "]}" + + "]}}"; + + //then: + assertThat(result2.toString()).isEqualTo(expected2); + } } \ No newline at end of file