/******************************************************************************* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2013,2014 by Peter Pilgrim, Addiscombe, Surrey, XeNoNiQUe UK * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU GPL v3.0 * which accompanies this distribution, and is available at: * http://www.gnu.org/licenses/gpl-3.0.txt * * Developers: * Peter Pilgrim -- design, development and implementation * -- Blog: http://www.xenonique.co.uk/blog/ * -- Twitter: @peter_pilgrim * * Contributors: * *******************************************************************************/ package je7hb.jpa.advanced.entitygraph1; import je7hb.jpa.Utils; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.junit.InSequence; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.Test; import org.junit.runner.RunWith; import javax.annotation.Resource; import javax.persistence.EntityGraph; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceUnitUtil; import javax.transaction.UserTransaction; import static org.junit.Assert.*; /** * A unit test ArtistEntityGraphRetrievalTest to verify the operation of ArtistEntityGraphRetrievalTest * * @author Peter Pilgrim */ @RunWith(Arquillian.class) public class ArtistEntityGraphRetrievalTest { @Deployment public static JavaArchive createDeployment() { JavaArchive jar = ShrinkWrap.create(JavaArchive.class) .addClasses(Artist.class, EventType.class, ConcertEvent.class, Contract.class, LiveEvent.class, StringHelper.class, Utils.class) .addAsResource( "test-persistence.xml", "META-INF/persistence.xml") .addAsManifestResource( EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml")); return jar; } @PersistenceContext EntityManager em; @Resource UserTransaction utx; @Test @InSequence(1) public void shouldSaveArtistWithAlbum() throws Exception{ StringBuilder text = new StringBuilder(); for ( int j=0; j<256; ++j) { text.append((char)(65 + Math.random() * 26)); } Contract contract = new Contract( 5150, "M and Ms", text.toString()); EventType eventType = new EventType(808, "WORLD TOUR"); Artist artist = new Artist(1002, "Lady Gaga" ); LiveEvent event = new LiveEvent(97502, "The Monster Ball Tour", eventType, artist, "Tokyo Dome", 55000 ); event.getContracts().add(contract); contract.setConcertEvent(event); artist.getEvents().put( eventType, event ); utx.begin(); em.persist(artist); utx.commit(); Artist artist2 = em.find(Artist.class, artist.getId()); Utils.assertEqualMaps(artist.getEvents(), artist2.getEvents()); } private Artist getArtistWithEntityGraph( String entityGraph) { EntityGraph artistGraph = em.getEntityGraph(entityGraph); return (Artist) em.createQuery("Select a from Artist a") .setHint("javax.persistence.fetchgraph", artistGraph) .getResultList() .get(0); } @Test @InSequence(2) public void shouldLoadArtistWithoutConcerts() throws Exception{ Artist artist = getArtistWithEntityGraph("Artist.NoConcerts"); PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil(); System.out.printf("++++ artist=%s\n", artist); System.out.printf(">> loaded artist.id = %s\n", util.isLoaded(artist, "id")); System.out.printf(">> loaded artist.name = %s\n", util.isLoaded(artist, "name")); System.out.printf(">> loaded artist.events = %s\n", util.isLoaded(artist, "events")); assertTrue(util.isLoaded(artist, "id")); assertTrue(util.isLoaded(artist, "name")); assertFalse(util.isLoaded(artist, "events")); } @Test @InSequence(3) public void shouldLoadArtistWithConcerts() throws Exception{ PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil(); Artist artist = getArtistWithEntityGraph("Artist.WithConcerts"); System.out.printf("++++ artist=%s\n", artist); System.out.printf("artist=%s\n", artist); assertTrue(util.isLoaded(artist, "id")); assertTrue(util.isLoaded(artist, "name")); assertTrue(util.isLoaded(artist, "events")); } @Test @InSequence(4) public void shouldLoadArtistWithLiveConcertsAndNoContracts() throws Exception { Artist artist = getArtistWithEntityGraph( "Artist.WithConcertsAndNoContracts"); PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil(); System.out.printf("++++ artist=%s\n", artist); assertTrue(util.isLoaded(artist, "id")); assertTrue(util.isLoaded(artist, "name")); assertTrue(util.isLoaded(artist, "events")); ConcertEvent event = artist.getEvents().values().iterator().next(); System.out.printf("++++ concert event=%s\n", event ); assertTrue(util.isLoaded(event, "id")); assertTrue(util.isLoaded(event, "name")); assertTrue(util.isLoaded(event, "eventType")); assertFalse(util.isLoaded(event, "contracts")); } @Test @InSequence(5) public void shouldLoadArtistWithLiveConcertsAndContracts() throws Exception{ EntityGraph artistGraph = em.getEntityGraph("Artist.WithConcertsAndContracts"); PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil(); Artist artist = getArtistWithEntityGraph( "Artist.WithConcertsAndContracts"); System.out.printf("++++ artist=%s\n", artist); assertTrue(util.isLoaded(artist, "id")); assertTrue(util.isLoaded(artist, "name")); assertTrue(util.isLoaded(artist, "events")); ConcertEvent event = artist.getEvents().values().iterator().next(); System.out.printf("++++ concert event=%s\n", event ); assertTrue(util.isLoaded(event, "id")); assertTrue(util.isLoaded(event, "name")); assertTrue(util.isLoaded(event, "eventType")); assertTrue(util.isLoaded(event, "contracts")); } }