Skip to content

Commit 0a25ef4

Browse files
committed
Added tests for entitygraph project.
Mixing a list parameter with entity graph fails in hibernate.
1 parent 4ad88e9 commit 0a25ef4

File tree

3 files changed

+76
-3
lines changed

3 files changed

+76
-3
lines changed

jpa/entitygraph/src/main/java/org/javaee7/jpa/entitygraph/Movie.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
@Entity
1414
@Table(name = "MOVIE_ENTITY_GRAPH")
1515
@NamedQueries({
16-
@NamedQuery(name = "Movie.findAll", query = "SELECT m FROM Movie m")
16+
@NamedQuery(name = "Movie.findAll", query = "SELECT m FROM Movie m"),
17+
@NamedQuery(name = "Movie.findAllById", query = "SELECT m FROM Movie m WHERE m.id = :movieId"),
18+
@NamedQuery(name = "Movie.findAllByIds", query = "SELECT m FROM Movie m WHERE m.id IN :movieIds")
1719
})
1820
@NamedEntityGraphs({
1921
@NamedEntityGraph(
@@ -57,6 +59,10 @@ public class Movie implements Serializable {
5759
@JoinColumn(name = "ID")
5860
private Set<MovieAward> movieAwards;
5961

62+
public Integer getId() {
63+
return id;
64+
}
65+
6066
public Set<MovieActor> getMovieActors() {
6167
return movieActors;
6268
}

jpa/entitygraph/src/main/java/org/javaee7/jpa/entitygraph/MovieBean.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,18 @@ public List<Movie> listMovies(String hint, EntityGraph<?> entityGraph) {
3131
.setHint(hint, entityGraph)
3232
.getResultList();
3333
}
34+
35+
public List<Movie> listMoviesById(Integer movieId, String hint, String graphName) {
36+
return entityManager.createNamedQuery("Movie.findAllById")
37+
.setParameter("movieId", movieId)
38+
.setHint(hint, entityManager.getEntityGraph(graphName))
39+
.getResultList();
40+
}
41+
42+
public List<Movie> listMoviesByIds(List<Integer> movieIds, String hint, String graphName) {
43+
return entityManager.createNamedQuery("Movie.findAllByIds")
44+
.setParameter("movieIds", movieIds)
45+
.setHint(hint, entityManager.getEntityGraph(graphName))
46+
.getResultList();
47+
}
3448
}

jpa/entitygraph/src/test/java/org/javaee7/jpa/entitygraph/EntityGraphTest.java

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
import javax.persistence.EntityManager;
1313
import javax.persistence.PersistenceContext;
1414
import javax.persistence.PersistenceUnitUtil;
15+
import java.util.Arrays;
1516
import java.util.List;
1617

17-
import static org.junit.Assert.assertFalse;
18-
import static org.junit.Assert.assertTrue;
18+
import static org.junit.Assert.*;
1919

2020
/**
2121
* In this sample we're going to query a +JPA Entity+ and control property loading by providing +Hints+ using the new
@@ -144,4 +144,57 @@ public void testEntityGraphProgrammatically() throws Exception {
144144
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
145145
}
146146
}
147+
148+
@Test
149+
public void testEntityGraphWithNamedParameters() throws Exception {
150+
PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
151+
List<Movie> listMovieById = movieBean.listMoviesById(1, "javax.persistence.fetchgraph", "movieWithActors");
152+
assertFalse(listMovieById.isEmpty());
153+
assertEquals(1, listMovieById.size());
154+
for (Movie movie : listMovieById) {
155+
assertTrue(movie.getId().equals(1));
156+
157+
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
158+
assertFalse(movie.getMovieActors().isEmpty());
159+
for (MovieActor movieActor : movie.getMovieActors()) {
160+
assertFalse(persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
161+
}
162+
163+
// https://hibernate.atlassian.net/browse/HHH-8776
164+
// The specification states that by using fetchgraph, attributes should stay unloaded even if defined as
165+
// EAGER (movieDirectors), but specification also states that the persistence provider is allowed to fetch
166+
// additional state.
167+
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors") ||
168+
!persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
169+
assertFalse(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
170+
}
171+
}
172+
173+
@Test
174+
public void testEntityGraphWithNamedParametersList() throws Exception {
175+
PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
176+
// Hibernate fails mixing Entity Graphs and Named Parameters with "IN". Throws NPE
177+
List<Movie> listMoviesByIds =
178+
movieBean.listMoviesByIds(Arrays.asList(1, 2), "javax.persistence.fetchgraph", "movieWithActors");
179+
180+
assertFalse(listMoviesByIds.isEmpty());
181+
assertEquals(2, listMoviesByIds.size());
182+
for (Movie movie : listMoviesByIds) {
183+
assertTrue(movie.getId().equals(1) || movie.getId().equals(2));
184+
185+
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
186+
assertFalse(movie.getMovieActors().isEmpty());
187+
for (MovieActor movieActor : movie.getMovieActors()) {
188+
assertFalse(persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
189+
}
190+
191+
// https://hibernate.atlassian.net/browse/HHH-8776
192+
// The specification states that by using fetchgraph, attributes should stay unloaded even if defined as
193+
// EAGER (movieDirectors), but specification also states that the persistence provider is allowed to fetch
194+
// additional state.
195+
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors") ||
196+
!persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
197+
assertFalse(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
198+
}
199+
}
147200
}

0 commit comments

Comments
 (0)