| /* |
| * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // Oracle - initial API and implementation |
| // 03/29/2016-2.6_WAS Will Dazey |
| // - 490114: Add testing for PersistenceUnitUtil.getIdentifier with nested embeddables in EmbeddedId class |
| package org.eclipse.persistence.testing.tests.jpa.complexaggregate; |
| |
| import java.beans.PropertyChangeListener; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.List; |
| |
| import jakarta.persistence.EntityManager; |
| import jakarta.persistence.EntityManagerFactory; |
| import jakarta.persistence.PersistenceUnitUtil; |
| import jakarta.persistence.Query; |
| |
| import junit.framework.Test; |
| import junit.framework.TestSuite; |
| |
| import org.eclipse.persistence.annotations.BatchFetchType; |
| import org.eclipse.persistence.config.QueryHints; |
| import org.eclipse.persistence.descriptors.ClassDescriptor; |
| import org.eclipse.persistence.descriptors.changetracking.ChangeTracker; |
| import org.eclipse.persistence.internal.descriptors.changetracking.AttributeChangeListener; |
| import org.eclipse.persistence.jpa.JpaHelper; |
| import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl; |
| import org.eclipse.persistence.testing.framework.JoinedAttributeTestHelper; |
| import org.eclipse.persistence.testing.framework.QuerySQLTracker; |
| import org.eclipse.persistence.testing.framework.TestErrorException; |
| import org.eclipse.persistence.testing.framework.junit.JUnitTestCase; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.Body; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.CitySlicker; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.CoachVitals; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.ComplexAggregateTableCreator; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.CountryDweller; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.Heart; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.HockeyCoach; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.HockeyPlayer; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.HockeyPuck; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.HockeyRink; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.HockeySponsor; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.HockeyTeam; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.Name; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.PersonalVitals; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.Location; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.Place; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.Role; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.TeamVitals; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.Torso; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.Vitals; |
| import org.eclipse.persistence.testing.models.jpa.complexaggregate.World; |
| |
| /** |
| * <p><b>Purpose</b>: To JPA with the complex aggregate test model. |
| */ |
| public class ComplexAggregateTestSuite extends JUnitTestCase { |
| |
| public ComplexAggregateTestSuite() { |
| } |
| |
| public ComplexAggregateTestSuite(String name) { |
| super(name); |
| } |
| |
| /** |
| * The setup is done as a test, both to record its failure, and to allow execution in the server. |
| */ |
| public void testSetup() { |
| new ComplexAggregateTableCreator().replaceTables(getDatabaseSession()); |
| clearCache(); |
| } |
| |
| public static Test suite() { |
| TestSuite suite = (TestSuite) suiteSpring(); |
| suite.addTest(new ComplexAggregateTestSuite("testInvalidateAndRefreshEmbeddableParent")); |
| |
| return suite; |
| } |
| |
| public static Test suiteSpring() { |
| TestSuite suite = new TestSuite(); |
| suite.setName("ComplexAggregateTestSuite"); |
| suite.addTest(new ComplexAggregateTestSuite("testSetup")); |
| suite.addTest(new ComplexAggregateTestSuite("testMapKeyColumnMerge")); |
| suite.addTest(new ComplexAggregateTestSuite("testAggregatePrimaryKey")); |
| suite.addTest(new ComplexAggregateTestSuite("testAggregatePrimaryKeyOrderBy")); |
| suite.addTest(new ComplexAggregateTestSuite("testNestedAggregate")); |
| suite.addTest(new ComplexAggregateTestSuite("testNestedAggregatePrimaryKey")); |
| suite.addTest(new ComplexAggregateTestSuite("testAggregateReadOnlyMapKey")); |
| suite.addTest(new ComplexAggregateTestSuite("testComplexAggregateJoin")); |
| suite.addTest(new ComplexAggregateTestSuite("testComplexAggregateBatch")); |
| suite.addTest(new ComplexAggregateTestSuite("testAggregateFieldAttributeOverrides")); |
| |
| return suite; |
| } |
| |
| public void testMapKeyColumnMerge() { |
| clearCache(); |
| |
| EntityManager em = createEntityManager(); |
| try { |
| HockeyPlayer player = new HockeyPlayer(); |
| player.setFirstName("Guy"); |
| player.setLastName("Flower"); |
| // must have non null Vitals and TeamVitals because TeamVitals has a target foreign key mapping, therefore allowingNull automatically set to false |
| Vitals vitals = new Vitals(); |
| vitals.setTeamVitals(new TeamVitals()); |
| player.setVitals(vitals); |
| |
| HockeyPlayer player2 = new HockeyPlayer(); |
| player2.setFirstName("Power"); |
| player2.setLastName("Flower");; |
| // must have non null Vitals and TeamVitals because TeamVitals has a target foreign key mapping, therefore allowingNull automatically set to false |
| Vitals vitals2 = new Vitals(); |
| vitals2.setTeamVitals(new TeamVitals()); |
| player2.setVitals(vitals2); |
| |
| HockeyCoach coach = new HockeyCoach(); |
| coach.setFirstName("Scott"); |
| coach.setLastName("Arrowman"); |
| CoachVitals cVitals = new CoachVitals(); |
| PersonalVitals pVitals = new PersonalVitals(); |
| pVitals.setAge(45); |
| pVitals.setHeight(3.3); |
| pVitals.setWeight(333); |
| cVitals.setPersonalVitals(pVitals); |
| coach.setVitals(cVitals); |
| |
| beginTransaction(em); |
| |
| em.persist(player); |
| em.persist(player2); |
| em.persist(coach); |
| Object playerId = player.getPlayerId(); |
| Object player2Id = player2.getPlayerId(); |
| Object coachId = coach.getId(); |
| coach.addFavouritePlayer(player); |
| |
| commitTransaction(em); |
| closeEntityManager(em); |
| |
| em = createEntityManager(); |
| beginTransaction(em); |
| // ((ChangeTracker)coach)._persistence_setPropertyChangeListener(null); |
| // ((IndirectMap)coach.getFavouritePlayers())._persistence_setPropertyChangeListener(null); |
| coach.addFavouritePlayer(player2); |
| em.merge(coach); |
| commitTransaction(em); |
| |
| beginTransaction(em); |
| player = em.find(HockeyPlayer.class, playerId); |
| player2 = em.find(HockeyPlayer.class, player2Id); |
| coach = em.find(HockeyCoach.class, coachId); |
| if (player != null){ |
| em.remove(player); |
| } |
| if (player2 != null){ |
| em.remove(player2); |
| } |
| if (coach != null){ |
| em.remove(coach); |
| } |
| commitTransaction(em); |
| } finally { |
| closeEntityManagerAndTransaction(em); |
| } |
| } |
| |
| public void testAggregatePrimaryKey() { |
| clearCache(); |
| EntityManager em = createEntityManager(); |
| try { |
| Name name1 = new Name(); |
| name1.setFirstName("Tom"); |
| name1.setLastName("Ware"); |
| |
| CountryDweller countryDweller = new CountryDweller(); |
| countryDweller.setAge(30); |
| countryDweller.setName(name1); |
| |
| CitySlicker citySlicker = new CitySlicker(); |
| citySlicker.setAge(53); |
| // Bug 300696 - Invalid tests: sharing embedded objects is not allowed |
| // Changed the test to use clone instead of sharing the same Name between the two Entities. |
| Name name1Clone = (Name)name1.clone(); |
| citySlicker.setName(name1Clone); |
| |
| Name name2 = new Name(); |
| name2.setFirstName("Guy"); |
| name2.setLastName("Pelletier"); |
| |
| CountryDweller countryDweller2 = new CountryDweller(); |
| countryDweller2.setAge(65); |
| countryDweller2.setName(name2); |
| |
| beginTransaction(em); |
| em.persist(countryDweller); |
| em.persist(countryDweller2); |
| em.persist(citySlicker); |
| commitTransaction(em); |
| |
| // Clear the cache. |
| clearCache(); |
| em.clear(); |
| |
| // Now read them back in and delete them. |
| beginTransaction(em); |
| |
| // Note that in Identity case name1Clone may no longer have the same id as name1 |
| CitySlicker cs = em.find(CitySlicker.class, name1Clone); |
| CountryDweller cd = em.merge(countryDweller); |
| CountryDweller cd2 = em.merge(countryDweller2); |
| |
| em.remove(cs); |
| em.remove(cd); |
| em.remove(cd2); |
| |
| commitTransaction(em); |
| } catch (RuntimeException e) { |
| closeEntityManagerAndTransaction(em); |
| throw e; |
| } |
| } |
| |
| public void testAggregatePrimaryKeyOrderBy() { |
| clearCache(); |
| EntityManager em = createEntityManager(); |
| try { |
| beginTransaction(em); |
| |
| World world = new World(); |
| |
| // First pair |
| Name name1 = new Name(); |
| name1.setFirstName("Guy"); |
| name1.setLastName("Pelletier"); |
| |
| CountryDweller countryDweller1 = new CountryDweller(); |
| countryDweller1.setAge(30); |
| countryDweller1.setName(name1); |
| countryDweller1.setGender("Male"); |
| em.persist(countryDweller1); |
| world.addCountryDweller(countryDweller1); |
| |
| CitySlicker citySlicker1 = new CitySlicker(); |
| citySlicker1.setAge(53); |
| // Bug 300696 - Invalid tests: sharing embedded objects is not allowed |
| // Changed the test to use clone instead of sharing the same Name between the two Entities. |
| Name name1Clone = (Name)name1.clone(); |
| citySlicker1.setName(name1Clone); |
| citySlicker1.setGender("Male"); |
| em.persist(citySlicker1); |
| world.addCitySlicker(citySlicker1); |
| |
| // Second pair |
| Name name2 = new Name(); |
| name2.setFirstName("Steve"); |
| name2.setLastName("Harp"); |
| |
| CountryDweller countryDweller2 = new CountryDweller(); |
| countryDweller2.setAge(28); |
| countryDweller2.setName(name2); |
| countryDweller2.setGender("Male"); |
| em.persist(countryDweller2); |
| world.addCountryDweller(countryDweller2); |
| |
| CitySlicker citySlicker2 = new CitySlicker(); |
| citySlicker2.setAge(41); |
| // Bug 300696 - Invalid tests: sharing embedded objects is not allowed |
| // Changed the test to use clone instead of sharing the same Name between the two Entities. |
| Name name2Clone = (Name)name2.clone(); |
| citySlicker2.setName(name2Clone); |
| citySlicker2.setGender("Male"); |
| em.persist(citySlicker2); |
| world.addCitySlicker(citySlicker2); |
| |
| // Third pair |
| Name name3 = new Name(); |
| name3.setFirstName("Jesse"); |
| name3.setLastName("Petoncle"); |
| |
| CountryDweller countryDweller3 = new CountryDweller(); |
| countryDweller3.setAge(48); |
| countryDweller3.setName(name3); |
| countryDweller3.setGender("Male"); |
| em.persist(countryDweller3); |
| world.addCountryDweller(countryDweller3); |
| |
| CitySlicker citySlicker3 = new CitySlicker(); |
| citySlicker3.setAge(76); |
| // Bug 300696 - Invalid tests: sharing embedded objects is not allowed |
| // Changed the test to use clone instead of sharing the same Name between the two Entities. |
| Name name3Clone = (Name)name3.clone(); |
| citySlicker3.setName(name3Clone); |
| citySlicker3.setGender("Female"); |
| em.persist(citySlicker3); |
| world.addCitySlicker(citySlicker3); |
| |
| em.persist(world); |
| |
| commitTransaction(em); |
| |
| // Clear the cache. |
| clearCache(); |
| em.clear(); |
| |
| // Now read them back in and delete them. |
| beginTransaction(em); |
| |
| World w = em.find(World.class, world.getId()); |
| |
| Collection<CitySlicker> css = w.getCitySlickers(); |
| css.toString(); |
| Collection<CountryDweller> cds = w.getCountryDwellers(); |
| cds.toString(); |
| |
| // Check the ordering |
| // JBS - Ordering check removed as order is random based on class method order which is not consistent in Java. |
| //citySlickersAreOrdered = ((CitySlicker) css.elementAt(0)).getName().getFirstName().equals("Guy") && ((CitySlicker) css.elementAt(1)).getName().getFirstName().equals("Jesse") && ((CitySlicker) css.elementAt(2)).getName().getFirstName().equals("Steve"); |
| //countryDwellersAreOrdered = ((CountryDweller) cds.elementAt(0)).getAge() == 28 && ((CountryDweller) cds.elementAt(1)).getAge() == 30 && ((CountryDweller) cds.elementAt(2)).getAge() == 48; |
| |
| // Make sure we delete them |
| // Note that in Identity case name1Clone may no longer have the same id as name1 |
| CitySlicker cs1 = em.find(CitySlicker.class, name1Clone); |
| em.remove(cs1); |
| CitySlicker cs2 = em.find(CitySlicker.class, name2Clone); |
| em.remove(cs2); |
| CitySlicker cs3 = em.find(CitySlicker.class, name3Clone); |
| em.remove(cs3); |
| |
| CountryDweller cd1 = em.merge(countryDweller1); |
| em.remove(cd1); |
| CountryDweller cd2 = em.merge(countryDweller2); |
| em.remove(cd2); |
| CountryDweller cd3 = em.merge(countryDweller3); |
| em.remove(cd3); |
| |
| commitTransaction(em); |
| |
| } catch (RuntimeException e) { |
| closeEntityManagerAndTransaction(em); |
| throw e; |
| } |
| } |
| |
| public void testNestedAggregate() { |
| int[] teamIDs = new int[3]; |
| clearCache(); |
| //////// Team 1 //////// |
| HockeyTeam team1 = new HockeyTeam(); |
| team1.setName("Axemen"); |
| team1.setAwayColor("Red"); |
| team1.setHomeColor("White"); |
| team1.setLevel("Division 5"); |
| |
| //////// Team 2 //////// |
| HockeyTeam team2 = new HockeyTeam(); |
| team2.setName("Cartier Partners"); |
| team2.setAwayColor("Black"); |
| team2.setHomeColor("White"); |
| team2.setLevel("Division 2"); |
| |
| //////// Team 3 //////// |
| HockeyTeam team3 = new HockeyTeam(); |
| team3.setName("Dead Last"); |
| team3.setAwayColor("Blue"); |
| team3.setHomeColor("White"); |
| team3.setLevel("Division 4"); |
| |
| //////// Player 1 //////// |
| HockeyPlayer player1 = new HockeyPlayer(); |
| player1.setFirstName("Guy"); |
| player1.setLastName("Pelletier"); |
| |
| PersonalVitals personalVitals1 = new PersonalVitals(); |
| personalVitals1.setAge(29); |
| personalVitals1.setHeight(1.80); |
| personalVitals1.setWeight(180); |
| |
| TeamVitals teamVitals1 = new TeamVitals(); |
| teamVitals1.setHockeyTeam(team2); |
| team2.getPlayers().add(player1); |
| teamVitals1.setJerseyNumber(20); |
| teamVitals1.setPosition("Goalie"); |
| teamVitals1.getRoles().add(new Role("Stop pucks!")); |
| |
| Vitals vitals1 = new Vitals(); |
| vitals1.setPersonalVitals(personalVitals1); |
| vitals1.setTeamVitals(teamVitals1); |
| player1.setVitals(vitals1); |
| |
| //////// Player 2 //////// |
| HockeyPlayer player2 = new HockeyPlayer(); |
| player2.setFirstName("Dave"); |
| player2.setLastName("McCann"); |
| |
| PersonalVitals personalVitals2 = new PersonalVitals(); |
| personalVitals2.setAge(35); |
| personalVitals2.setHeight(1.77); |
| personalVitals2.setWeight(165); |
| |
| TeamVitals teamVitals2 = new TeamVitals(); |
| teamVitals2.setHockeyTeam(team1); |
| team1.getPlayers().add(player2); |
| teamVitals2.setJerseyNumber(70); |
| teamVitals2.setPosition("Left wing"); |
| teamVitals2.getRoles().add(new Role("Power play unit")); |
| teamVitals2.getRoles().add(new Role("Face-off specialist")); |
| |
| Vitals vitals2 = new Vitals(); |
| vitals2.setPersonalVitals(personalVitals2); |
| vitals2.setTeamVitals(teamVitals2); |
| player2.setVitals(vitals2); |
| |
| //////// Player 3 //////// |
| HockeyPlayer player3 = new HockeyPlayer(); |
| player3.setFirstName("Tom"); |
| player3.setLastName("Ware"); |
| |
| PersonalVitals personalVitals3 = new PersonalVitals(); |
| personalVitals3.setAge(30); |
| personalVitals3.setHeight(1.83); |
| personalVitals3.setWeight(200); |
| |
| TeamVitals teamVitals3 = new TeamVitals(); |
| teamVitals3.setHockeyTeam(team1); |
| team1.getPlayers().add(player3); |
| teamVitals3.setJerseyNumber(12); |
| teamVitals3.setPosition("Defence"); |
| teamVitals3.getRoles().add(new Role("Penalty kill unit")); |
| |
| Vitals vitals3 = new Vitals(); |
| vitals3.setPersonalVitals(personalVitals3); |
| vitals3.setTeamVitals(teamVitals3); |
| player3.setVitals(vitals3); |
| |
| //////// Player 4 //////// |
| HockeyPlayer player4 = new HockeyPlayer(); |
| player4.setFirstName("George"); |
| player4.setLastName("Robinson"); |
| |
| PersonalVitals personalVitals4 = new PersonalVitals(); |
| personalVitals4.setAge(32); |
| personalVitals4.setHeight(1.86); |
| personalVitals4.setWeight(210); |
| |
| TeamVitals teamVitals4 = new TeamVitals(); |
| teamVitals4.setHockeyTeam(team3); |
| team3.getPlayers().add(player4); |
| teamVitals4.setJerseyNumber(6); |
| teamVitals4.setPosition("Center"); |
| teamVitals4.getRoles().add(new Role("Power play unit")); |
| teamVitals4.getRoles().add(new Role("Goon")); |
| |
| Vitals vitals4 = new Vitals(); |
| vitals4.setPersonalVitals(personalVitals4); |
| vitals4.setTeamVitals(teamVitals4); |
| player4.setVitals(vitals4); |
| |
| //////// Player 5 //////// |
| HockeyPlayer player5 = new HockeyPlayer(); |
| player5.setFirstName("Andrew"); |
| player5.setLastName("Glennie"); |
| |
| PersonalVitals personalVitals5 = new PersonalVitals(); |
| personalVitals5.setAge(31); |
| personalVitals5.setHeight(1.80); |
| personalVitals5.setWeight(205); |
| |
| TeamVitals teamVitals5 = new TeamVitals(); |
| teamVitals5.setHockeyTeam(team3); |
| team3.getPlayers().add(player5); |
| teamVitals5.setJerseyNumber(7); |
| teamVitals5.setPosition("Right wing"); |
| |
| Vitals vitals5 = new Vitals(); |
| vitals5.setPersonalVitals(personalVitals5); |
| vitals5.setTeamVitals(teamVitals5); |
| player5.setVitals(vitals5); |
| |
| //////// Player 6 //////// |
| HockeyPlayer player6 = new HockeyPlayer(); |
| player6.setFirstName("David"); |
| player6.setLastName("Whittaker"); |
| |
| PersonalVitals personalVitals6 = new PersonalVitals(); |
| personalVitals6.setAge(32); |
| personalVitals6.setHeight(1.83); |
| personalVitals6.setWeight(190); |
| |
| TeamVitals teamVitals6 = new TeamVitals(); |
| teamVitals6.setHockeyTeam(team2); |
| team2.getPlayers().add(player6); |
| teamVitals6.setJerseyNumber(17); |
| teamVitals6.setPosition("Defence"); |
| |
| Vitals vitals6 = new Vitals(); |
| vitals6.setPersonalVitals(personalVitals6); |
| vitals6.setTeamVitals(teamVitals6); |
| player6.setVitals(vitals6); |
| |
| //////// Coach 1 //////// |
| HockeyCoach coach1 = new HockeyCoach(); |
| coach1.setFirstName("Don"); |
| coach1.setLastName("Hyslop"); |
| |
| PersonalVitals coachPersonalVitals1 = new PersonalVitals(); |
| coachPersonalVitals1.setAge(55); |
| coachPersonalVitals1.setHeight(1.85); |
| coachPersonalVitals1.setWeight(200); |
| |
| CoachVitals coachVitals1 = new CoachVitals(); |
| coachVitals1.setPersonalVitals(coachPersonalVitals1); |
| coachVitals1.setHockeyTeam(team1); |
| team1.getCoaches().add(coach1); |
| coach1.setVitals(coachVitals1); |
| |
| //////// Coach 2 //////// |
| HockeyCoach coach2 = new HockeyCoach(); |
| coach2.setFirstName("Al"); |
| coach2.setLastName("Montoya"); |
| |
| PersonalVitals coachPersonalVitals2 = new PersonalVitals(); |
| coachPersonalVitals2.setAge(63); |
| coachPersonalVitals2.setHeight(1.86); |
| coachPersonalVitals2.setWeight(213); |
| |
| CoachVitals coachVitals2 = new CoachVitals(); |
| coachVitals2.setPersonalVitals(coachPersonalVitals2); |
| coachVitals2.setHockeyTeam(team2); |
| team2.getCoaches().add(coach2); |
| coach2.setVitals(coachVitals2); |
| |
| //////// Coach 3 //////// |
| HockeyCoach coach3 = new HockeyCoach(); |
| coach3.setFirstName("Guy"); |
| coach3.setLastName("Carbonneau"); |
| |
| PersonalVitals coachPersonalVitals3 = new PersonalVitals(); |
| coachPersonalVitals3.setAge(47); |
| coachPersonalVitals3.setHeight(1.91); |
| coachPersonalVitals3.setWeight(191); |
| |
| CoachVitals coachVitals3 = new CoachVitals(); |
| coachVitals3.setPersonalVitals(coachPersonalVitals3); |
| coachVitals3.setHockeyTeam(team3); |
| team3.getCoaches().add(coach3); |
| coach3.setVitals(coachVitals3); |
| |
| //////// Coach 4 //////// |
| HockeyCoach coach4 = new HockeyCoach(); |
| coach4.setFirstName("Walter"); |
| coach4.setLastName("Mullen"); |
| |
| PersonalVitals coachPersonalVitals4 = new PersonalVitals(); |
| coachPersonalVitals4.setAge(67); |
| coachPersonalVitals4.setHeight(1.94); |
| coachPersonalVitals4.setWeight(187); |
| |
| CoachVitals coachVitals4 = new CoachVitals(); |
| coachVitals4.setPersonalVitals(coachPersonalVitals4); |
| coachVitals4.setHockeyTeam(team1); |
| team1.getCoaches().add(coach4); |
| coach4.setVitals(coachVitals4); |
| |
| //////// Coach 5 //////// |
| HockeyCoach coach5 = new HockeyCoach(); |
| coach5.setFirstName("Ben"); |
| coach5.setLastName("Gasket"); |
| |
| PersonalVitals coachPersonalVitals5 = new PersonalVitals(); |
| coachPersonalVitals5.setAge(33); |
| coachPersonalVitals5.setHeight(1.67); |
| coachPersonalVitals5.setWeight(155); |
| |
| CoachVitals coachVitals5 = new CoachVitals(); |
| coachVitals5.setPersonalVitals(coachPersonalVitals5); |
| coachVitals5.setHockeyTeam(team2); |
| team2.getCoaches().add(coach5); |
| coach5.setVitals(coachVitals5); |
| |
| //////// Coach 6 //////// |
| HockeyCoach coach6 = new HockeyCoach(); |
| coach6.setFirstName("Jim"); |
| coach6.setLastName("Balogna"); |
| |
| PersonalVitals coachPersonalVitals6 = new PersonalVitals(); |
| coachPersonalVitals6.setAge(37); |
| coachPersonalVitals6.setHeight(1.77); |
| coachPersonalVitals6.setWeight(179); |
| |
| CoachVitals coachVitals6 = new CoachVitals(); |
| coachVitals6.setPersonalVitals(coachPersonalVitals5); |
| coachVitals6.setHockeyTeam(team3); |
| team3.getCoaches().add(coach6); |
| coach6.setVitals(coachVitals6); |
| |
| EntityManager em = createEntityManager(); |
| //////// Commit the new objects //////// |
| beginTransaction(em); |
| |
| try{ |
| em.persist(team1); |
| teamIDs[0] = team1.getId(); |
| em.persist(team2); |
| teamIDs[1] = team2.getId(); |
| em.persist(team3); |
| teamIDs[2] = team3.getId(); |
| |
| em.persist(player1); |
| em.persist(player2); |
| em.persist(player3); |
| em.persist(player4); |
| em.persist(player5); |
| em.persist(player6); |
| |
| em.persist(coach1); |
| em.persist(coach2); |
| em.persist(coach3); |
| em.persist(coach4); |
| em.persist(coach5); |
| em.persist(coach6); |
| |
| commitTransaction(em); |
| } catch (RuntimeException ex) { |
| closeEntityManagerAndTransaction(em); |
| throw ex; |
| } |
| |
| em = createEntityManager(); |
| // Check the cache for the objects |
| checkTeam(teamIDs[0], em); |
| checkTeam(teamIDs[1], em); |
| checkTeam(teamIDs[2], em); |
| |
| // Initialize the identity map to make sure they were persisted |
| clearCache(); |
| |
| em = createEntityManager(); |
| em.clear(); |
| |
| checkTeam(teamIDs[0], em); |
| checkTeam(teamIDs[1], em); |
| checkTeam(teamIDs[2], em); |
| |
| // Verify the order by on coaches worked for team 1 (teamIDs[0]) |
| HockeyTeam team = em.find(HockeyTeam.class, teamIDs[0]); |
| |
| if (team.getCoaches().get(0).getVitals().getPersonalVitals().getAge() != 67) { |
| throw new TestErrorException("The order by specification on age for hockey coaches was not observed: " + team.getCoaches()); |
| } |
| } |
| |
| private void checkTeam(int id, EntityManager em) { |
| HockeyTeam team = em.find(HockeyTeam.class, id); |
| if (team == null){ |
| throw new TestErrorException("Hockey team with ID: " + id + ", was not created."); |
| } |
| |
| if (team.getPlayers().size() != 2) { |
| throw new TestErrorException("Hockey team with ID: " + id + ", did not have 2 players, had: " + team.getPlayers().size()); |
| } |
| |
| if (team.getCoaches().size() != 2) { |
| throw new TestErrorException("Hockey team with ID: " + id + ", did not have 2 coach, had: " + team.getCoaches().size()); |
| } |
| } |
| |
| public void testNestedAggregatePrimaryKey() { |
| clearCache(); |
| |
| Torso torso; |
| |
| EntityManagerFactory emf = getEntityManagerFactory(); |
| EntityManager em = createEntityManager(); |
| try { |
| Body body = new Body(); |
| torso = new Torso(); |
| Heart heart = new Heart(); |
| heart.setSize(8); |
| torso.setHeart(heart); |
| body.setTorso(torso); |
| |
| beginTransaction(em); |
| em.persist(body); |
| commitTransaction(em); |
| } catch (Exception e) { |
| throw new TestErrorException("Exception caught when persisting the new body: " + e.getMessage()); |
| } finally { |
| closeEntityManager(em); |
| } |
| |
| em = createEntityManager(); |
| Exception m_testException = null; |
| DatabaseSessionImpl m_session = getDatabaseSession(); |
| Body m_refreshedBody = null; |
| // Try to read the body back, clear the cache first. |
| try { |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| m_refreshedBody = em.find(Body.class, torso); |
| } catch (Exception e) { |
| m_testException = e; |
| } |
| |
| if (m_testException != null) { |
| throw new TestErrorException("Exception caught reading back the persisted body: " + m_testException); |
| } |
| |
| if (m_refreshedBody == null) { |
| throw new TestErrorException("Unable to read back the persisted body"); |
| } |
| |
| ClassDescriptor descriptor = getDatabaseSession().getClassDescriptor(Body.class); |
| Object pks = descriptor.getObjectBuilder().extractPrimaryKeyFromObject(m_refreshedBody, m_session); |
| Torso createdTorso = (Torso) descriptor.getCMPPolicy().createPrimaryKeyInstanceFromId(pks, m_session); |
| assertTrue("PK's do not match.", m_refreshedBody.getTorso().equals(createdTorso)); |
| |
| PersistenceUnitUtil util = emf.getPersistenceUnitUtil(); |
| assertTrue("PersistenceUnitUtil returned incorrect identifier", torso.equals(util.getIdentifier(m_refreshedBody))); |
| } |
| |
| public void testAggregateReadOnlyMapKey() { |
| clearCache(); |
| |
| HockeyPlayer player = new HockeyPlayer(); |
| player.setFirstName("Guy"); |
| player.setLastName("Flower"); |
| |
| PersonalVitals personalVitals2 = new PersonalVitals(); |
| personalVitals2.setAge(45); |
| personalVitals2.setHeight(1.80); |
| personalVitals2.setWeight(185); |
| |
| TeamVitals teamVitals2 = new TeamVitals(); |
| teamVitals2.setJerseyNumber(70); |
| teamVitals2.setPosition("Right wing"); |
| |
| Vitals vitals2 = new Vitals(); |
| vitals2.setPersonalVitals(personalVitals2); |
| vitals2.setTeamVitals(teamVitals2); |
| player.setVitals(vitals2); |
| |
| HockeyCoach coach = new HockeyCoach(); |
| coach.setFirstName("Scott"); |
| coach.setLastName("Arrowman"); |
| |
| PersonalVitals coachPersonalVitals1 = new PersonalVitals(); |
| coachPersonalVitals1.setAge(65); |
| coachPersonalVitals1.setHeight(1.85); |
| coachPersonalVitals1.setWeight(200); |
| |
| CoachVitals coachVitals1 = new CoachVitals(); |
| coachVitals1.setPersonalVitals(coachPersonalVitals1); |
| coach.setVitals(coachVitals1); |
| |
| EntityManager em = createEntityManager(); |
| beginTransaction(em); |
| try { |
| em.persist(player); |
| em.persist(coach); |
| commitTransaction(em); |
| |
| Object playerId = player.getPlayerId(); |
| Object coachId = coach.getId(); |
| |
| clearCache(); |
| em.clear(); |
| |
| beginTransaction(em); |
| player = em.find(HockeyPlayer.class, player.getPlayerId()); |
| coach = em.find(HockeyCoach.class, coach.getId()); |
| |
| coach.addFavouritePlayer(player); |
| commitTransaction(em); |
| |
| beginTransaction(em); |
| player = em.find(HockeyPlayer.class, playerId); |
| coach = em.find(HockeyCoach.class, coachId); |
| if (player != null){ |
| em.remove(player); |
| } |
| if (coach != null){ |
| em.remove(coach); |
| } |
| commitTransaction(em); |
| } finally { |
| closeEntityManagerAndTransaction(em); |
| } |
| } |
| |
| public void testComplexAggregateJoin() { |
| clearCache(); |
| |
| HockeyTeam team1 = new HockeyTeam(); |
| team1.setName("Axemen"); |
| team1.setAwayColor("Red"); |
| team1.setHomeColor("White"); |
| team1.setLevel("Division 5"); |
| |
| ////////Player 1 //////// |
| HockeyPlayer player1 = new HockeyPlayer(); |
| player1.setFirstName("Guy"); |
| player1.setLastName("Pelletier"); |
| |
| PersonalVitals personalVitals1 = new PersonalVitals(); |
| personalVitals1.setAge(29); |
| personalVitals1.setHeight(1.80); |
| personalVitals1.setWeight(180); |
| |
| TeamVitals teamVitals1 = new TeamVitals(); |
| |
| teamVitals1.setJerseyNumber(20); |
| teamVitals1.setPosition("Goalie"); |
| teamVitals1.getRoles().add(new Role("Stop pucks!")); |
| |
| Vitals vitals1 = new Vitals(); |
| vitals1.setPersonalVitals(personalVitals1); |
| vitals1.setTeamVitals(teamVitals1); |
| player1.setVitals(vitals1); |
| |
| |
| ////////Coach 1 //////// |
| HockeyCoach coach1 = new HockeyCoach(); |
| coach1.setFirstName("Don"); |
| coach1.setLastName("Hyslop"); |
| |
| PersonalVitals coachPersonalVitals1 = new PersonalVitals(); |
| coachPersonalVitals1.setAge(55); |
| coachPersonalVitals1.setHeight(1.85); |
| coachPersonalVitals1.setWeight(200); |
| |
| CoachVitals coachVitals1 = new CoachVitals(); |
| coachVitals1.setPersonalVitals(coachPersonalVitals1); |
| coach1.setVitals(coachVitals1); |
| |
| ////////persist the new objects //////// |
| |
| EntityManager em = createEntityManager(); |
| beginTransaction(em); |
| em.persist(team1); |
| |
| em.persist(player1); |
| em.persist(coach1); |
| |
| //setup relationships: |
| teamVitals1.setHockeyTeam(team1); |
| team1.getPlayers().add(player1); |
| team1.getCoaches().add(coach1); |
| coachVitals1.setHockeyTeam(team1); |
| |
| em.flush(); |
| |
| DatabaseSessionImpl m_session = getDatabaseSession(); |
| List hockeyCoachResults = null; |
| List controledCoachList = null; |
| List controledPlayerList = null; |
| List hockeyPlayerResults = null; |
| try { |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| Query query1 = em.createQuery("Select a from HockeyCoach a where a.id = "+coach1.getId()); |
| query1.setHint(QueryHints.LEFT_FETCH, "a.vitals.hockeyTeam"); |
| hockeyCoachResults = query1.getResultList(); |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| Query query2 = em.createQuery("Select z from HockeyPlayer z where z.playerId = "+player1.getPlayerId()); |
| //query2.setHint(QueryHints.LEFT_FETCH, "z.coach"); |
| query2.setHint(QueryHints.LEFT_FETCH, "z.vitals.teamVitals.hockeyTeam.coaches"); |
| hockeyPlayerResults = query2.getResultList(); |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| HockeyCoach expectedCoach = em.find(HockeyCoach.class, coach1.getId()); |
| expectedCoach.getVitals().getHockeyTeam(); |
| controledCoachList = new ArrayList<HockeyCoach>(1); |
| controledCoachList.add(expectedCoach); |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| HockeyPlayer expectedPlayer = em.find(HockeyPlayer.class, player1.getPlayerId()); |
| expectedPlayer.getVitals().getTeamVitals().getHockeyTeam().getCoaches().size(); |
| controledPlayerList = new ArrayList<HockeyPlayer>(1); |
| controledPlayerList.add(expectedPlayer); |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| } finally { |
| try { |
| closeEntityManagerAndTransaction(em); |
| } catch (RuntimeException re){ |
| //ignore |
| } |
| } |
| |
| String errorMsg = JoinedAttributeTestHelper.compareCollections(controledCoachList, hockeyCoachResults, m_session.getClassDescriptor(HockeyCoach.class), m_session); |
| if (errorMsg.length() > 0) { |
| throw new TestErrorException(errorMsg); |
| } |
| |
| errorMsg = JoinedAttributeTestHelper.compareCollections(controledPlayerList, hockeyPlayerResults, m_session.getClassDescriptor(HockeyPlayer.class), m_session); |
| if (errorMsg.length() > 0) { |
| throw new TestErrorException(errorMsg); |
| } |
| } |
| |
| public void testComplexAggregateBatch() { |
| clearCache(); |
| |
| HockeyTeam team1 = new HockeyTeam(); |
| team1.setName("Axemen"); |
| team1.setAwayColor("Red"); |
| team1.setHomeColor("White"); |
| team1.setLevel("Division 5"); |
| |
| HockeyTeam team2 = new HockeyTeam(); |
| team2.setName("Ducks"); |
| team2.setAwayColor("Black"); |
| team2.setHomeColor("Red"); |
| team2.setLevel("Division 4"); |
| |
| ////////Player 1 //////// |
| HockeyPlayer player1 = new HockeyPlayer(); |
| player1.setFirstName("Guy"); |
| player1.setLastName("Pelletier"); |
| |
| PersonalVitals personalVitals1 = new PersonalVitals(); |
| personalVitals1.setAge(29); |
| personalVitals1.setHeight(1.80); |
| personalVitals1.setWeight(180); |
| |
| TeamVitals teamVitals1 = new TeamVitals(); |
| |
| teamVitals1.setJerseyNumber(20); |
| teamVitals1.setPosition("Goalie"); |
| teamVitals1.getRoles().add(new Role("Stop pucks!")); |
| |
| Vitals vitals1 = new Vitals(); |
| vitals1.setPersonalVitals(personalVitals1); |
| vitals1.setTeamVitals(teamVitals1); |
| player1.setVitals(vitals1); |
| |
| |
| ////////Coach 1 //////// |
| HockeyCoach coach1 = new HockeyCoach(); |
| coach1.setFirstName("Don"); |
| coach1.setLastName("Hyslop"); |
| |
| PersonalVitals coachPersonalVitals1 = new PersonalVitals(); |
| coachPersonalVitals1.setAge(55); |
| coachPersonalVitals1.setHeight(1.85); |
| coachPersonalVitals1.setWeight(200); |
| |
| CoachVitals coachVitals1 = new CoachVitals(); |
| coachVitals1.setPersonalVitals(coachPersonalVitals1); |
| coach1.setVitals(coachVitals1); |
| |
| ////////Coach 2 //////// |
| HockeyCoach coach2 = new HockeyCoach(); |
| coach2.setFirstName("Bob"); |
| coach2.setLastName("Jones"); |
| |
| PersonalVitals coachPersonalVitals2 = new PersonalVitals(); |
| coachPersonalVitals2.setAge(44); |
| coachPersonalVitals2.setHeight(1.95); |
| coachPersonalVitals2.setWeight(250); |
| |
| CoachVitals coachVitals2 = new CoachVitals(); |
| coachVitals2.setPersonalVitals(coachPersonalVitals2); |
| coach2.setVitals(coachVitals2); |
| |
| ////////persist the new objects //////// |
| |
| DatabaseSessionImpl m_session = getDatabaseSession(); |
| |
| // Count SQL. |
| QuerySQLTracker counter = new QuerySQLTracker(m_session); |
| |
| EntityManager em = createEntityManager(); |
| |
| beginTransaction(em); |
| em.persist(team1); |
| em.persist(team2); |
| |
| em.persist(player1); |
| em.persist(coach1); |
| em.persist(coach2); |
| |
| //setup relationships: |
| teamVitals1.setHockeyTeam(team1); |
| team1.getPlayers().add(player1); |
| team1.getCoaches().add(coach1); |
| team2.getCoaches().add(coach2); |
| coachVitals1.setHockeyTeam(team1); |
| coachVitals2.setHockeyTeam(team2); |
| |
| em.flush(); |
| try { |
| counter.getSqlStatements().clear(); |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| Query query1 = em.createQuery("Select a from HockeyCoach a"); |
| query1.setHint(QueryHints.BATCH, "a.vitals.hockeyTeam"); |
| List<HockeyCoach> hockeyCoachResults = query1.getResultList(); |
| for (HockeyCoach coach : hockeyCoachResults) { |
| coach.getVitals().getHockeyTeam(); |
| } |
| |
| if (isWeavingEnabled() && counter.getSqlStatements().size() != 2) { |
| fail("Should have been 2 queries but was: " + counter.getSqlStatements().size()); |
| } |
| |
| counter.getSqlStatements().clear(); |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| query1 = em.createQuery("Select a from HockeyCoach a"); |
| query1.setHint(QueryHints.BATCH, "a.vitals.hockeyTeam"); |
| query1.setHint(QueryHints.BATCH_TYPE, BatchFetchType.IN); |
| hockeyCoachResults = query1.getResultList(); |
| for (HockeyCoach coach : hockeyCoachResults) { |
| coach.getVitals().getHockeyTeam(); |
| } |
| |
| if (isWeavingEnabled() && counter.getSqlStatements().size() != 2) { |
| fail("Should have been 2 queries but was: " + counter.getSqlStatements().size()); |
| } |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| counter.getSqlStatements().clear(); |
| |
| query1 = em.createQuery("Select a from HockeyCoach a"); |
| query1.setHint(QueryHints.BATCH, "a.vitals.hockeyTeam"); |
| query1.setHint(QueryHints.BATCH_TYPE, BatchFetchType.EXISTS); |
| hockeyCoachResults = query1.getResultList(); |
| for (HockeyCoach coach : hockeyCoachResults) { |
| coach.getVitals().getHockeyTeam(); |
| } |
| |
| if (isWeavingEnabled() && counter.getSqlStatements().size() != 2) { |
| fail("Should have been 2 queries but was: " + counter.getSqlStatements().size()); |
| } |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| Query query2 = em.createQuery("Select z from HockeyPlayer z where z.playerId <> 0"); |
| query2.setHint(QueryHints.BATCH, "z.vitals.teamVitals.hockeyTeam.coaches"); |
| List<HockeyPlayer> hockeyPlayerResults = query2.getResultList(); |
| for (HockeyPlayer player : hockeyPlayerResults) { |
| player.getVitals().getTeamVitals().getHockeyTeam().getCoaches(); |
| } |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| query2 = em.createQuery("Select z from HockeyPlayer z where z.playerId <> 0"); |
| query2.setHint(QueryHints.BATCH, "z.vitals.teamVitals.hockeyTeam.coaches"); |
| query2.setHint(QueryHints.BATCH_TYPE, BatchFetchType.IN); |
| hockeyPlayerResults = query2.getResultList(); |
| for (HockeyPlayer player : hockeyPlayerResults) { |
| player.getVitals().getTeamVitals().getHockeyTeam().getCoaches(); |
| } |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| |
| query2 = em.createQuery("Select z from HockeyPlayer z where z.playerId <> 0"); |
| query2.setHint(QueryHints.BATCH, "z.vitals.teamVitals.hockeyTeam.coaches"); |
| query2.setHint(QueryHints.BATCH_TYPE, BatchFetchType.EXISTS); |
| hockeyPlayerResults = query2.getResultList(); |
| for (HockeyPlayer player : hockeyPlayerResults) { |
| player.getVitals().getTeamVitals().getHockeyTeam().getCoaches(); |
| } |
| |
| em.clear(); |
| m_session.getIdentityMapAccessor().initializeAllIdentityMaps(); |
| } finally { |
| try { |
| closeEntityManagerAndTransaction(em); |
| } catch (RuntimeException re){ |
| //ignore |
| } |
| if (counter != null) { |
| counter.remove(); |
| } |
| } |
| } |
| |
| public void testAggregateFieldAttributeOverrides() { |
| clearCache(); |
| DatabaseSessionImpl m_session = getDatabaseSession(); |
| |
| EntityManager em = createEntityManager(); |
| |
| beginTransaction(em); |
| |
| Place place = new Place(); |
| place.setCountryCode("US"); |
| place.setName("Nowhere"); |
| place.setAddress1(new Location("12 Main Street", "US")); |
| place.setAddress2(new Location("34 Easy Street", "US")); |
| |
| em.persist(place); |
| |
| em.flush(); |
| |
| rollbackTransaction(em); |
| } |
| |
| /** |
| * Bug 474956 RepeatableUnitOfWork linked by Embeddable in shared cache in specific scenario |
| * Test the invalidation and refresh of a parent object with an Embeddable instantiated |
| * with non-null values. After associating the parent with another object, the Embeddable |
| * should not reference a UnitOfWork (via a change listener) within the shared cache. |
| */ |
| public void testInvalidateAndRefreshEmbeddableParent() { |
| // test depends on weaving |
| if (!isWeavingEnabled()) { |
| warning("Test depends on weaving and change tracking"); |
| return; |
| } |
| |
| HockeyPuck puck = null; |
| HockeyRink rink = null; |
| |
| // setup |
| clearCache(); |
| |
| EntityManager em = createEntityManager(); |
| try { |
| beginTransaction(em); |
| |
| puck = new HockeyPuck(); |
| puck.setId(1); |
| puck.setName("MrWraparound"); |
| puck.getSponsor().setName("ACME Cloud Computing Company, Inc."); |
| puck.getSponsor().setSponsorshipValue(1000000); |
| em.persist(puck); |
| |
| commitTransaction(em); |
| } finally { |
| closeEntityManager(em); |
| } |
| |
| // test |
| em = createEntityManager(); |
| try { |
| // 1. invalidate existing Entity in the cache |
| JpaHelper.getDatabaseSession(getEntityManagerFactory()).getIdentityMapAccessor().invalidateObject(puck.getId(), HockeyPuck.class); |
| assertFalse("Existing cached HockeyPuck should not be valid", |
| JpaHelper.getDatabaseSession(getEntityManagerFactory()).getIdentityMapAccessor().isValid(puck.getId(), HockeyPuck.class)); |
| |
| beginTransaction(em); |
| |
| // 2. create new Entity and persist |
| rink = new HockeyRink(); |
| rink.setId(1); |
| em.persist(rink); |
| |
| // 3. load existing Entity |
| puck = em.createQuery("select object(p) from HockeyPuck p where p.id = " + puck.getId(), HockeyPuck.class).getSingleResult(); |
| assertNotNull("HockeyPuck loaded should not be null", puck); |
| |
| // 4. associate loaded existing Entity with persisted new Entity |
| rink.setPuck(puck); |
| |
| commitTransaction(em); |
| } finally { |
| closeEntityManager(em); |
| } |
| |
| // verify, go directly to the shared cache for the parent Entity |
| try { |
| HockeyPuck cachedPuck = (HockeyPuck)JpaHelper.getDatabaseSession(getEntityManagerFactory()).getIdentityMapAccessor().getFromIdentityMap(puck.getId(), HockeyPuck.class); |
| HockeySponsor sponsor = cachedPuck.getSponsor(); |
| if (sponsor instanceof ChangeTracker) { |
| PropertyChangeListener listener = ((ChangeTracker)sponsor)._persistence_getPropertyChangeListener(); |
| // listener can be null |
| if (listener != null && listener instanceof AttributeChangeListener) { |
| assertNull("UnitOfWork referenced in Embeddable referenced by an object in the shared cache", ((AttributeChangeListener)listener).getUnitOfWork()); |
| } |
| } else { |
| fail("Config error: HockeyPuck/HockeySponsor is not change tracked"); |
| } |
| } finally { |
| // reset |
| em = createEntityManager(); |
| beginTransaction(em); |
| |
| if (puck != null) { |
| puck = em.find(HockeyPuck.class, puck.getId()); |
| if (puck != null) { |
| em.remove(puck); |
| } |
| } |
| if (rink != null) { |
| rink = em.find(HockeyRink.class, rink.getId()); |
| if (rink != null) { |
| em.remove(rink); |
| } |
| } |
| |
| commitTransaction(em); |
| closeEntityManager(em); |
| } |
| } |
| |
| } |