Entitygraph

Run
How to run the sample
The source code for this sample can be found in the javaee7-samples GitHub repository. The first thing we need to do is to get the source by downloading the repository and then go into the samples folder:
git clone git://github.com/javaee-samples/javaee7-samples.git
cd javaee7-samples/jpa/entitygraph/
Now we are ready to start testing. You can run all the tests in this sample by executing:
mvn test
Or you can run individual tests by executing one of the following:
mvn test -Dtest=EntityGraphTest

EntityGraphTest

In this sample we’re going to query a JPA Entity and control property loading by providing Hints using the new JPA Entity Graph API. <p/> Entity Graphs are used in the specification of fetch plans for query or find operations.

Missing a description for the deployment. Add some javadoc to the @Deployment method. Show me how!
@Deployment
public static WebArchive createDeployment() {
    WebArchive war = ShrinkWrap.create(WebArchive.class)
                               .addPackage("org.javaee7.jpa.entitygraph")
                               .addAsResource("META-INF/persistence.xml")
                               .addAsResource("META-INF/create.sql")
                               .addAsResource("META-INF/drop.sql")
                               .addAsResource("META-INF/load.sql");
    System.out.println(war.toString(true));
    return war;
}
Missing a description for the test scenario. Add some javadoc to the @Test method. Show me how!
@Test
public void testEntityGraphMovieDefault() throws Exception {
    PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
    List<Movie> listMoviesDefaultFetch = movieBean.listMovies();
    for (Movie movie : listMoviesDefaultFetch) {
        assertFalse(persistenceUnitUtil.isLoaded(movie, "movieActors"));
        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
        assertFalse(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
    }
}
Missing a description for the test scenario. Add some javadoc to the @Test method. Show me how!
@Test
public void testEntityGraphMovieWithActors() throws Exception {
    PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
    List<Movie> listMoviesWithActorsFetch = movieBean.listMovies("javax.persistence.fetchgraph", "movieWithActors");
    for (Movie movie : listMoviesWithActorsFetch) {
        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
        assertFalse(movie.getMovieActors().isEmpty());
        for (MovieActor movieActor : movie.getMovieActors()) {
            assertFalse(persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
        }

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

    List<Movie> listMoviesWithActorsLoad = movieBean.listMovies("javax.persistence.loadgraph", "movieWithActors");
    for (Movie movie : listMoviesWithActorsLoad) {
        // https://java.net/jira/browse/GLASSFISH-21200
        // Glassfish is not processing "javax.persistence.loadgraph".
        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
        assertFalse(movie.getMovieActors().isEmpty());
        for (MovieActor movieActor : movie.getMovieActors()) {
            assertFalse(persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
        }

        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
        assertFalse(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
    }
}
Missing a description for the test scenario. Add some javadoc to the @Test method. Show me how!
@Test
public void testEntityGraphMovieWithActorsAndAwards() throws Exception {
    PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
    List<Movie> listMoviesWithActorsFetch =
            movieBean.listMovies("javax.persistence.fetchgraph", "movieWithActorsAndAwards");
    for (Movie movie : listMoviesWithActorsFetch) {
        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
        assertFalse(movie.getMovieActors().isEmpty());
        for (MovieActor movieActor : movie.getMovieActors()) {
            assertTrue(persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards") ||
                       !persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
        }

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

    List<Movie> listMoviesWithActorsLoad =
            movieBean.listMovies("javax.persistence.loadgraph", "movieWithActorsAndAwards");
    for (Movie movie : listMoviesWithActorsLoad) {
        // https://java.net/jira/browse/GLASSFISH-21200
        // Glassfish is not processing "javax.persistence.loadgraph".
        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
        assertFalse(movie.getMovieActors().isEmpty());
        for (MovieActor movieActor : movie.getMovieActors()) {
            assertTrue(persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
        }

        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
        assertFalse(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
    }
}
Missing a description for the test scenario. Add some javadoc to the @Test method. Show me how!
@Test
public void testEntityGraphProgrammatically() throws Exception {
    PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();

    EntityGraph<Movie> fetchAll = entityManager.createEntityGraph(Movie.class);
    fetchAll.addSubgraph(Movie_.movieActors);
    fetchAll.addSubgraph(Movie_.movieDirectors);
    fetchAll.addSubgraph(Movie_.movieAwards);

    List<Movie> moviesFetchAll = movieBean.listMovies("javax.persistence.fetchgraph", fetchAll);
    for (Movie movie : moviesFetchAll) {
        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
    }
}
Missing a description for the test scenario. Add some javadoc to the @Test method. Show me how!
@Test
public void testEntityGraphWithNamedParameters() throws Exception {
    PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
    List<Movie> listMovieById = movieBean.listMoviesById(1, "javax.persistence.fetchgraph", "movieWithActors");
    assertFalse(listMovieById.isEmpty());
    assertEquals(1, listMovieById.size());
    for (Movie movie : listMovieById) {
        assertTrue(movie.getId().equals(1));

        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
        assertFalse(movie.getMovieActors().isEmpty());
        for (MovieActor movieActor : movie.getMovieActors()) {
            assertFalse(persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
        }

        // https://hibernate.atlassian.net/browse/HHH-8776
        // The specification states that by using fetchgraph, attributes should stay unloaded even if defined as
        // EAGER (movieDirectors), but specification also states that the persistence provider is allowed to fetch
        // additional state.
        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieDirectors") ||
                   !persistenceUnitUtil.isLoaded(movie, "movieDirectors"));
        assertFalse(persistenceUnitUtil.isLoaded(movie, "movieAwards"));
    }
}
Missing a description for the test scenario. Add some javadoc to the @Test method. Show me how!
@Test
public void testEntityGraphWithNamedParametersList() throws Exception {
    PersistenceUnitUtil persistenceUnitUtil = entityManager.getEntityManagerFactory().getPersistenceUnitUtil();
    // Hibernate fails mixing Entity Graphs and Named Parameters with "IN". Throws NPE
    List<Movie> listMoviesByIds =
            movieBean.listMoviesByIds(Arrays.asList(1, 2), "javax.persistence.fetchgraph", "movieWithActors");

    assertFalse(listMoviesByIds.isEmpty());
    assertEquals(2, listMoviesByIds.size());
    for (Movie movie : listMoviesByIds) {
        assertTrue(movie.getId().equals(1) || movie.getId().equals(2));

        assertTrue(persistenceUnitUtil.isLoaded(movie, "movieActors"));
        assertFalse(movie.getMovieActors().isEmpty());
        for (MovieActor movieActor : movie.getMovieActors()) {
            assertFalse(persistenceUnitUtil.isLoaded(movieActor, "movieActorAwards"));
        }

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

Share the Knowledge

Find this sample useful? Share on

There's a lot more about JavaEE to cover. If you're ready to learn more, check out the other available samples.

Help Improve

Find a bug in the sample? Something missing? You can fix it by editing the source, making the correction and sending a pull request. Or report the problem to the issue tracker

Recent Changelog

  • Dec 08, 2014: Added tests for entitygraph project by Roberto Cortez
  • Nov 18, 2014: Added programmatic example by Roberto Cortez
  • Nov 12, 2014: Added sample for entity graph by Roberto Cortez
  • Jul 15, 2014: Removed header license. the licensing is now referenced in the license file in the root of the project by Roberto Cortez
  • Sep 17, 2013: Removing netbeans configuration file by Arun Gupta
  • Aug 27, 2013: Moving the source code from http://svn.java.net/svn/glassfish~svn/branches/arun/javaee7-samples/samples/ by Arun Gupta
How to help improve this sample
The source code for this sample can be found in the javaee7-samples GitHub repository. The first thing you need to do is to get the source by downloading the repository and then go into the samples folder:
git clone git://github.com/javaee-samples/javaee7-samples.git
cd javaee7-samples/jpa/entitygraph/

Do the changes as you see fit and send a pull request!

Good Luck!