Skip to content

Commit 9f0b519

Browse files
committed
Added programmatic example.
Refactored MovieBean to accept hint and entitygraph as parameters.
1 parent c3a6687 commit 9f0b519

File tree

4 files changed

+64
-35
lines changed

4 files changed

+64
-35
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,17 @@ public class Movie implements Serializable {
4747

4848
@OneToMany
4949
@JoinColumn(name = "ID")
50-
private List<MovieActor> movieActors;
50+
private Set<MovieActor> movieActors;
5151

5252
@OneToMany(fetch = FetchType.EAGER)
5353
@JoinColumn(name = "ID")
54-
private List<MovieDirector> movieDirectors;
54+
private Set<MovieDirector> movieDirectors;
5555

5656
@OneToMany
5757
@JoinColumn(name = "ID")
58-
private List<MovieAward> movieAwards;
58+
private Set<MovieAward> movieAwards;
5959

60-
public List<MovieActor> getMovieActors() {
60+
public Set<MovieActor> getMovieActors() {
6161
return movieActors;
6262
}
6363

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.javaee7.jpa.entitygraph;
22

33
import javax.ejb.Stateless;
4+
import javax.persistence.EntityGraph;
45
import javax.persistence.EntityManager;
56
import javax.persistence.PersistenceContext;
67
import java.util.List;
@@ -12,33 +13,22 @@
1213
@Stateless
1314
public class MovieBean {
1415
@PersistenceContext
15-
private EntityManager em;
16+
private EntityManager entityManager;
1617

17-
public List<Movie> listMoviesDefault() {
18-
return em.createNamedQuery("Movie.findAll").getResultList();
18+
public List<Movie> listMovies() {
19+
return entityManager.createNamedQuery("Movie.findAll")
20+
.getResultList();
1921
}
2022

21-
public List<Movie> listMoviesWithActorsFetch() {
22-
return em.createNamedQuery("Movie.findAll")
23-
.setHint("javax.persistence.fetchgraph", em.getEntityGraph("movieWithActors"))
24-
.getResultList();
23+
public List<Movie> listMovies(String hint, String graphName) {
24+
return entityManager.createNamedQuery("Movie.findAll")
25+
.setHint(hint, entityManager.getEntityGraph(graphName))
26+
.getResultList();
2527
}
2628

27-
public List<Movie> listMoviesWithActorsLoad() {
28-
return em.createNamedQuery("Movie.findAll")
29-
.setHint("javax.persistence.loadgraph", em.getEntityGraph("movieWithActors"))
30-
.getResultList();
31-
}
32-
33-
public List<Movie> listMoviesWithActorsAndAwardsFetch() {
34-
return em.createNamedQuery("Movie.findAll")
35-
.setHint("javax.persistence.fetchgraph", em.getEntityGraph("movieWithActorsAndAwards"))
36-
.getResultList();
37-
}
38-
39-
public List<Movie> listMoviesWithActorsAndAwardsLoad() {
40-
return em.createNamedQuery("Movie.findAll")
41-
.setHint("javax.persistence.loadgraph", em.getEntityGraph("movieWithActorsAndAwards"))
42-
.getResultList();
29+
public List<Movie> listMovies(String hint, EntityGraph<?> entityGraph) {
30+
return entityManager.createNamedQuery("Movie.findAll")
31+
.setHint(hint, entityGraph)
32+
.getResultList();
4333
}
4434
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.javaee7.jpa.entitygraph;
2+
3+
import javax.persistence.metamodel.SetAttribute;
4+
import javax.persistence.metamodel.SingularAttribute;
5+
import javax.persistence.metamodel.StaticMetamodel;
6+
7+
/**
8+
* @author Roberto Cortez
9+
*/
10+
@StaticMetamodel(Movie.class)
11+
public abstract class Movie_ {
12+
public static volatile SingularAttribute<Movie, Integer> id;
13+
public static volatile SetAttribute<Movie, MovieAward> movieAwards;
14+
public static volatile SingularAttribute<Movie, String> name;
15+
public static volatile SetAttribute<Movie, MovieActor> movieActors;
16+
public static volatile SetAttribute<Movie, MovieDirector> movieDirectors;
17+
}

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

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.junit.runner.RunWith;
99

1010
import javax.inject.Inject;
11+
import javax.persistence.EntityGraph;
1112
import javax.persistence.EntityManager;
1213
import javax.persistence.PersistenceContext;
1314
import javax.persistence.PersistenceUnitUtil;
@@ -19,6 +20,8 @@
1920
/**
2021
* In this sample we're going to query a +JPA Entity+ and control property loading by providing +Hints+ using the new
2122
* +JPA Entity Graph+ API.
23+
* <p/>
24+
* Entity Graphs are used in the specification of fetch plans for query or find operations.
2225
*
2326
* @author Roberto Cortez
2427
*/
@@ -44,7 +47,7 @@ public static WebArchive createDeployment() {
4447
@Test
4548
public void testEntityGraphMovieDefault() throws Exception {
4649
PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
47-
List<Movie> listMoviesDefaultFetch = movieBean.listMoviesDefault();
50+
List<Movie> listMoviesDefaultFetch = movieBean.listMovies();
4851
for (Movie movie : listMoviesDefaultFetch) {
4952
assertFalse(persistenceUnitUtil.isLoaded(movie, "movieActors"));
5053
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
@@ -55,7 +58,7 @@ public void testEntityGraphMovieDefault() throws Exception {
5558
@Test
5659
public void testEntityGraphMovieWithActors() throws Exception {
5760
PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
58-
List<Movie> listMoviesWithActorsFetch = movieBean.listMoviesWithActorsFetch();
61+
List<Movie> listMoviesWithActorsFetch = movieBean.listMovies("javax.persistence.fetchgraph", "movieWithActors");
5962
for (Movie movie : listMoviesWithActorsFetch) {
6063
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
6164
assertFalse(movie.getMovieActors().isEmpty());
@@ -68,11 +71,11 @@ public void testEntityGraphMovieWithActors() throws Exception {
6871
// EAGER (movieDirectors), but specification also states that the persistence provider is allowed to fetch
6972
// additional state.
7073
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors") ||
71-
!persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
74+
!persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
7275
assertFalse(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
7376
}
7477

75-
List<Movie> listMoviesWithActorsLoad = movieBean.listMoviesWithActorsLoad();
78+
List<Movie> listMoviesWithActorsLoad = movieBean.listMovies("javax.persistence.loadgraph", "movieWithActors");
7679
for (Movie movie : listMoviesWithActorsLoad) {
7780
// https://java.net/jira/browse/GLASSFISH-21200
7881
// Glassfish is not processing "javax.persistence.loadgraph".
@@ -90,25 +93,27 @@ public void testEntityGraphMovieWithActors() throws Exception {
9093
@Test
9194
public void testEntityGraphMovieWithActorsAndAwards() throws Exception {
9295
PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
93-
List<Movie> listMoviesWithActorsFetch = movieBean.listMoviesWithActorsAndAwardsFetch();
96+
List<Movie> listMoviesWithActorsFetch =
97+
movieBean.listMovies("javax.persistence.fetchgraph", "movieWithActorsAndAwards");
9498
for (Movie movie : listMoviesWithActorsFetch) {
9599
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
96100
assertFalse(movie.getMovieActors().isEmpty());
97101
for (MovieActor movieActor : movie.getMovieActors()) {
98102
assertTrue(persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards") ||
99-
!persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
103+
!persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
100104
}
101105

102106
// https://hibernate.atlassian.net/browse/HHH-8776
103107
// The specification states that by using fetchgraph, attributes should stay unloaded even if defined as
104108
// EAGER (movieDirectors), but specification also states that the persistence provider is allowed to fetch
105109
// additional state.
106110
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors") ||
107-
!persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
111+
!persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
108112
assertFalse(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
109113
}
110114

111-
List<Movie> listMoviesWithActorsLoad = movieBean.listMoviesWithActorsAndAwardsLoad();
115+
List<Movie> listMoviesWithActorsLoad =
116+
movieBean.listMovies("javax.persistence.loadgraph", "movieWithActorsAndAwards");
112117
for (Movie movie : listMoviesWithActorsLoad) {
113118
// https://java.net/jira/browse/GLASSFISH-21200
114119
// Glassfish is not processing "javax.persistence.loadgraph".
@@ -122,4 +127,21 @@ public void testEntityGraphMovieWithActorsAndAwards() throws Exception {
122127
assertFalse(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
123128
}
124129
}
130+
131+
@Test
132+
public void testEntityGraphProgrammatically() throws Exception {
133+
PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
134+
135+
EntityGraph<Movie> fetchAll = entityManager.createEntityGraph(Movie.class);
136+
fetchAll.addSubgraph(Movie_.movieActors);
137+
fetchAll.addSubgraph(Movie_.movieDirectors);
138+
fetchAll.addSubgraph(Movie_.movieAwards);
139+
140+
List<Movie> moviesFetchAll = movieBean.listMovies("javax.persistence.fetchgraph", fetchAll);
141+
for (Movie movie : moviesFetchAll) {
142+
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
143+
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
144+
assertTrue(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
145+
}
146+
}
125147
}

0 commit comments

Comments
 (0)