| /* |
| * Copyright (c) 2005, 2021 Oracle and/or its affiliates. All rights reserved. |
| * Copyright (c) 2005, 2015 SAP. 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: |
| // SAP - initial API and implementation |
| |
| package org.eclipse.persistence.testing.tests.wdf.jpa1.relation; |
| |
| import static org.junit.Assert.assertTrue; |
| |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.List; |
| import java.util.Set; |
| |
| import jakarta.persistence.Cache; |
| import jakarta.persistence.EntityManager; |
| |
| import org.eclipse.persistence.testing.framework.wdf.Bugzilla; |
| import org.eclipse.persistence.testing.framework.wdf.JPAEnvironment; |
| import org.eclipse.persistence.testing.framework.wdf.ToBeInvestigated; |
| import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Bicycle; |
| import org.eclipse.persistence.testing.models.wdf.jpa1.employee.CostCenter; |
| import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Cubicle; |
| import org.eclipse.persistence.testing.models.wdf.jpa1.employee.CubiclePrimaryKeyClass; |
| import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Employee; |
| import org.eclipse.persistence.testing.models.wdf.jpa1.employee.MotorVehicle; |
| import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Project; |
| import org.eclipse.persistence.testing.models.wdf.jpa1.employee.TravelProfile; |
| import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Vehicle; |
| import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base; |
| import org.junit.Test; |
| |
| /** |
| * Testing relations in combination with object cache. Test cases generated by all-pairs testing tool: <ul><li>ToManyFK, eager, |
| * owning side right, cacheable both: testCostCenterEmployee</li> <li>ToOneFK, lazy, owning side left, cacheable right: |
| * testMotorVehicleEmployee</li> <li>ToOneFK, eager, owning side right, cacheable both: testCubicleEmployee</li> <li> |
| * ToManyJoinTable, eager, owning side left, cacheable right: testBicycleEmployee</li> <li>ToManyJoinTable, lazy, owning side |
| * left, cacheable both: testEmployeeProject</li> <li>ToManyFK, lazy, owning side right, cacheable right: n.a.</li> <li> |
| * ToManyJoinTable, lazy, owning side right, cacheable right: testTravelProfileVehicle</li> |
| * |
| * |
| * |
| * <li>ToManyJoinTable, lazy, owning side right, cacheable both: testProjectEmployee</li> <li>ToManyJoinTable, lazy, owning side |
| * left, cacheable left: testEmployeePatent</li> <li>ToOneFK, eager, owning side left, cacheable left: testEmployeeTravelProfile |
| * </li> <li>ToManyFK, eager, owning side right, cacheable right</li> </ul> |
| */ |
| public class TestRelationshipsWithCache extends JPA1Base { |
| |
| /** |
| * Test case: CostCenter.employees |
| * <p> |
| * Relationship mapping: ToManyFK, FetchType: eager, owning side: right, cacheable: both |
| */ |
| @Test |
| @Bugzilla(bugid=309681) |
| public void testCostCenterEmployee() { |
| final JPAEnvironment env = getEnvironment(); |
| final EntityManager em = env.getEntityManager(); |
| final Cache cache = em.getEntityManagerFactory().getCache(); |
| |
| int costCenterId = 1; |
| CostCenter costCenter = new CostCenter(1, "lotsOfMoney"); |
| int employeeId1 = 1; |
| int employeeId2 = 2; |
| Employee employee1 = new Employee(employeeId1, "very", "expensive", null); |
| Employee employee2 = new Employee(employeeId2, "even", "moreExpensive", null); |
| costCenter.addEmployee(employee1); |
| costCenter.addEmployee(employee2); |
| employee1.setCostCenter(costCenter); |
| employee2.setCostCenter(costCenter); |
| try { |
| env.beginTransaction(em); |
| em.persist(costCenter); |
| em.persist(employee1); |
| em.persist(employee2); |
| env.commitTransactionAndClear(em); |
| |
| em.find(CostCenter.class, costCenterId); // eager loading of Employees |
| assertTrue(cache.contains(CostCenter.class, costCenterId)); |
| assertTrue(cache.contains(Employee.class, employeeId1)); |
| assertTrue(cache.contains(Employee.class, employeeId2)); |
| |
| env.beginTransaction(em); |
| costCenter = em.find(CostCenter.class, costCenterId); |
| employee1 = em.find(Employee.class, employeeId1); |
| employee2 = em.find(Employee.class, employeeId2); |
| List<Employee> foundEmployees = costCenter.getEmployees(); |
| assertTrue(foundEmployees != null); |
| assertTrue("wrong number of riders: " + foundEmployees.size(), foundEmployees.size() == 2); |
| if (foundEmployees.get(0).getId() == employeeId1) { |
| assertTrue("wrong rider: " + foundEmployees.get(1).getId(), foundEmployees.get(1).getId() == employeeId2); |
| } else { |
| assertTrue("wrong rider: " + foundEmployees.get(0).getId(), foundEmployees.get(0).getId() == employeeId2); |
| assertTrue("wrong rider: " + foundEmployees.get(1).getId(), foundEmployees.get(1).getId() == employeeId1); |
| } |
| CostCenter costCenter1 = employee1.getCostCenter(); |
| CostCenter costCenter2 = employee2.getCostCenter(); |
| assertTrue(costCenter1 != null); |
| assertTrue(costCenter1.getId() == costCenterId); |
| assertTrue(costCenter2 != null); |
| assertTrue(costCenter2.getId() == costCenterId); |
| costCenter.setEmployees(null); |
| employee1.setCostCenter(null); |
| employee2.setCostCenter(null); |
| env.commitTransactionAndClear(em); |
| |
| assertTrue(!cache.contains(CostCenter.class, costCenterId)); |
| assertTrue(!cache.contains(Employee.class, employeeId1)); |
| assertTrue(!cache.contains(Employee.class, employeeId2)); |
| costCenter = em.find(CostCenter.class, costCenterId); |
| employee1 = em.find(Employee.class, employeeId1); |
| employee2 = em.find(Employee.class, employeeId2); |
| assertTrue(costCenter.getEmployees().size() == 0); |
| assertTrue(employee1.getCostCenter() == null); |
| assertTrue(employee2.getCostCenter() == null); |
| } finally { |
| closeEntityManager(em); |
| } |
| } |
| |
| /** |
| * Test case: MotorVehicle.driver |
| * <p> |
| * Relationship mapping: ToOneFK, FetchType: lazy, owning side: left, cacheable: right |
| */ |
| @Test |
| @Bugzilla(bugid=309681) |
| public void testMotorVehicleEmployee() { |
| final JPAEnvironment env = getEnvironment(); |
| final EntityManager em = env.getEntityManager(); |
| final Cache cache = em.getEntityManagerFactory().getCache(); |
| final boolean isLazyToOneEnabled = false; |
| |
| MotorVehicle motorVehicle = new MotorVehicle(); |
| int employeeId = 11; |
| Employee employee = new Employee(employeeId, "first", "driver", null); |
| motorVehicle.setDriver(employee); |
| employee.setMotorVehicle(motorVehicle); |
| try { |
| env.beginTransaction(em); |
| em.persist(motorVehicle); |
| em.persist(employee); |
| env.commitTransactionAndClear(em); |
| Short motorVehicleId = motorVehicle.getId(); |
| |
| em.find(MotorVehicle.class, motorVehicleId); |
| if (isLazyToOneEnabled) { |
| assertTrue(!cache.contains(Employee.class, employeeId)); |
| employee = em.find(Employee.class, employeeId); |
| // assertTrue(employee instanceof LazilyLoadable); FIXME |
| // assertTrue( ((LazilyLoadable) employee)._isPending() ); FIXME |
| } else { |
| assertTrue(cache.contains(Employee.class, employeeId)); |
| } |
| |
| env.beginTransaction(em); |
| motorVehicle = em.find(MotorVehicle.class, motorVehicleId); |
| employee = em.find(Employee.class, employeeId); |
| assertTrue(employeeId == motorVehicle.getDriver().getId()); |
| assertTrue(motorVehicleId.equals(employee.getMotorVehicle().getId())); |
| assertTrue(employee == motorVehicle.getDriver()); |
| motorVehicle.setDriver(null); |
| employee.setMotorVehicle(null); |
| env.commitTransactionAndClear(em); |
| |
| assertTrue(!cache.contains(Employee.class, employeeId)); |
| motorVehicle = em.find(MotorVehicle.class, motorVehicleId); |
| employee = em.find(Employee.class, employeeId); |
| assertTrue(motorVehicle.getDriver() == null); |
| assertTrue(employee.getMotorVehicle() == null); |
| } finally { |
| closeEntityManager(em); |
| } |
| } |
| |
| /** |
| * Test case: Employee.cubicle |
| * <p> |
| * Relationship mapping: ToOneFK, FetchType: eager, owning side: right, cacheable: both |
| */ |
| @Test |
| @Bugzilla(bugid=309681) |
| public void testCubicleEmployee() { |
| final JPAEnvironment env = getEnvironment(); |
| final EntityManager em = env.getEntityManager(); |
| final Cache cache = em.getEntityManagerFactory().getCache(); |
| |
| int employeeId = 21; |
| Employee employee = new Employee(employeeId, "first", "last", null); |
| CubiclePrimaryKeyClass cubicleId = new CubiclePrimaryKeyClass(1, 2); |
| Cubicle cubicle = new Cubicle(cubicleId, "red", employee); |
| employee.setCubicle(cubicle); |
| try { |
| env.beginTransaction(em); |
| em.persist(employee); |
| em.persist(cubicle); |
| env.commitTransactionAndClear(em); |
| |
| em.find(Cubicle.class, cubicleId); |
| assertTrue(cache.contains(Cubicle.class, cubicleId)); |
| assertTrue(cache.contains(Employee.class, employeeId)); |
| |
| env.beginTransaction(em); |
| cubicle = em.find(Cubicle.class, cubicleId); |
| employee = em.find(Employee.class, employeeId); |
| assertTrue("cubicle has wrong employee: " + cubicle.getEmployee().getId(), employeeId == cubicle.getEmployee() |
| .getId()); |
| assertTrue("employee has wrong cubicle: " + employee.getCubicle().getId(), cubicleId.equals(employee.getCubicle() |
| .getId())); |
| cubicle.setEmployee(null); |
| employee.setCubicle(null); |
| env.commitTransactionAndClear(em); |
| |
| assertTrue(!cache.contains(Cubicle.class, cubicleId)); |
| assertTrue(!cache.contains(Employee.class, employeeId)); |
| cubicle = em.find(Cubicle.class, cubicleId); |
| employee = em.find(Employee.class, employeeId); |
| assertTrue(cubicle.getEmployee() == null); |
| assertTrue(employee.getCubicle() == null); |
| } finally { |
| closeEntityManager(em); |
| } |
| } |
| |
| /** |
| * Test case: Bicycle.employees |
| * <p> |
| * Relationship mapping: ToManyJoinTable, FetchType: eager, owning side: left, cacheable: right |
| */ |
| @Test |
| @Bugzilla(bugid=309681) |
| public void testBicycleEmployee() { |
| final JPAEnvironment env = getEnvironment(); |
| final EntityManager em = env.getEntityManager(); |
| final Cache cache = em.getEntityManagerFactory().getCache(); |
| |
| Bicycle bicycle = new Bicycle(); |
| int employeeId1 = 31; |
| int employeeId2 = 32; |
| Employee employee1 = new Employee(employeeId1, "good", "rider1", null); |
| Employee employee2 = new Employee(employeeId2, "bad", "rider2", null); |
| employee1.addBicycle(bicycle); // maintains also bicycle.riders relationship |
| employee2.addBicycle(bicycle); |
| try { |
| env.beginTransaction(em); |
| em.persist(bicycle); |
| em.persist(employee1); |
| em.persist(employee2); |
| env.commitTransactionAndClear(em); |
| Short bicycleId = bicycle.getId(); |
| |
| em.find(Bicycle.class, bicycleId); // eager loading of Employees |
| assertTrue(cache.contains(Employee.class, employeeId1)); |
| assertTrue(cache.contains(Employee.class, employeeId2)); |
| |
| env.beginTransaction(em); |
| bicycle = em.find(Bicycle.class, bicycleId); |
| employee1 = em.find(Employee.class, employeeId1); |
| employee2 = em.find(Employee.class, employeeId2); |
| Collection<Employee> foundRiders = bicycle.getRiders(); |
| assertTrue(foundRiders != null); |
| assertTrue("wrong number of riders: " + foundRiders.size(), foundRiders.size() == 2); |
| Employee[] ridersArray = foundRiders.toArray(new Employee[2]); |
| if (ridersArray[0].getId() == employeeId1) { |
| assertTrue("wrong rider: " + ridersArray[1].getId(), ridersArray[1].getId() == employeeId2); |
| } else { |
| assertTrue("wrong rider: " + ridersArray[0].getId(), ridersArray[0].getId() == employeeId2); |
| assertTrue("wrong rider: " + ridersArray[1].getId(), ridersArray[1].getId() == employeeId1); |
| } |
| Set<Bicycle> bicycles1 = employee1.getBicycles(); |
| Set<Bicycle> bicycles2 = employee2.getBicycles(); |
| assertTrue(bicycles1 != null); |
| assertTrue(bicycles2 != null); |
| assertTrue(bicycles1.size() == 1); |
| assertTrue(bicycles2.size() == 1); |
| assertTrue(bicycleId.equals(bicycles1.toArray(new Bicycle[1])[0].getId())); |
| assertTrue(bicycleId.equals(bicycles2.toArray(new Bicycle[1])[0].getId())); |
| bicycle.setRiders(null); |
| employee1.setBicycles(null); |
| employee2.setBicycles(null); |
| env.commitTransactionAndClear(em); |
| |
| assertTrue(!cache.contains(Employee.class, employeeId1)); |
| assertTrue(!cache.contains(Employee.class, employeeId2)); |
| bicycle = em.find(Bicycle.class, bicycleId); |
| employee1 = em.find(Employee.class, employeeId1); |
| employee2 = em.find(Employee.class, employeeId2); |
| assertTrue(bicycle.getRiders().size() == 0); |
| assertTrue(employee1.getBicycles().size() == 0); |
| assertTrue(employee2.getBicycles().size() == 0); |
| } finally { |
| closeEntityManager(em); |
| } |
| } |
| |
| /** |
| * Test case: Employee.projects |
| * <p> |
| * Relationship mapping: ToManyJoinTable, FetchType: lazy, owning side: left, cacheable: both |
| */ |
| @SuppressWarnings("unchecked") |
| @Test |
| @Bugzilla(bugid=309681) |
| public void testEmployeeProject() { |
| final JPAEnvironment env = getEnvironment(); |
| final EntityManager em = env.getEntityManager(); |
| final Cache cache = em.getEntityManagerFactory().getCache(); |
| |
| int employeeId = 41; |
| Employee employee = new Employee(employeeId, "aaa", "member", null); |
| Project project1 = new Project("evaluation"); |
| Project project2 = new Project("demotivation"); |
| project1.addEmployee(employee); // maintains also employee.projects relationship |
| project2.addEmployee(employee); |
| try { |
| env.beginTransaction(em); |
| em.persist(employee); |
| em.persist(project1); |
| em.persist(project2); |
| env.commitTransactionAndClear(em); |
| Integer projectId1 = project1.getId(); |
| Integer projectId2 = project2.getId(); |
| |
| env.beginTransaction(em); |
| employee = em.find(Employee.class, employeeId); |
| assertTrue(cache.contains(Employee.class, employeeId)); |
| assertTrue(!cache.contains(Project.class, projectId1)); // lazy loading of projects |
| assertTrue(!cache.contains(Project.class, projectId2)); |
| employee.getProjects().size(); |
| assertTrue(cache.contains(Project.class, projectId1)); |
| assertTrue(cache.contains(Project.class, projectId2)); |
| project1 = em.find(Project.class, projectId1); |
| project2 = em.find(Project.class, projectId2); |
| Set<Project> foundProjects = employee.getProjects(); |
| assertTrue(foundProjects != null); |
| assertTrue("wrong number of projects: " + foundProjects.size(), foundProjects.size() == 2); |
| Project[] projArray = foundProjects.toArray(new Project[2]); |
| if (projArray[0].getId().equals(projectId1)) { |
| assertTrue("wrong project: " + projArray[1].getId(), projArray[1].getId().equals(projectId2)); |
| } else { |
| assertTrue("wrong project: " + projArray[0].getId(), projArray[0].getId().equals(projectId2)); |
| assertTrue("wrong project: " + projArray[1].getId(), projArray[1].getId().equals(projectId1)); |
| } |
| Set<Employee> employees1 = project1.getEmployees(); |
| Set<Employee> employees2 = project2.getEmployees(); |
| assertTrue(employees1 != null); |
| assertTrue(employees2 != null); |
| assertTrue(employees1.size() == 1); |
| assertTrue(employees2.size() == 1); |
| assertTrue(employees1.toArray(new Employee[1])[0].getId() == employeeId); |
| assertTrue(employees2.toArray(new Employee[1])[0].getId() == employeeId); |
| employee.setProjects(null); |
| project1.setEmployees(null); |
| project2.setEmployees(null); |
| env.commitTransactionAndClear(em); |
| |
| assertTrue(!cache.contains(Employee.class, employeeId)); |
| assertTrue(!cache.contains(Project.class, projectId1)); |
| assertTrue(!cache.contains(Project.class, projectId2)); |
| employee = em.find(Employee.class, employeeId); |
| project1 = em.find(Project.class, projectId1); |
| project2 = em.find(Project.class, projectId2); |
| assertTrue(employee.getProjects().size() == 0); |
| assertTrue(project1.getEmployees().size() == 0); |
| assertTrue(project2.getEmployees().size() == 0); |
| } finally { |
| closeEntityManager(em); |
| } |
| } |
| |
| /** |
| * Test case: TravelProfile.vehicles |
| * <p> |
| * Relationship mapping: ToManyJoinTable, FetchType: lazy, owning side: right, cacheable: right |
| */ |
| @SuppressWarnings("unchecked") |
| @Test |
| @ToBeInvestigated |
| public void testTravelProfileVehicle() { // TODO remove |
| final JPAEnvironment env = getEnvironment(); |
| final EntityManager em = env.getEntityManager(); |
| final Cache cache = em.getEntityManagerFactory().getCache(); |
| |
| byte[] travelProfileId = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; |
| TravelProfile travelProfile = new TravelProfile(travelProfileId, true, "neverComeBack"); |
| Vehicle vehicle1 = new Vehicle(); |
| Vehicle vehicle2 = new Vehicle(); |
| vehicle1.addProfile(travelProfile); // maintains also travelProfile.vehicles relationship |
| vehicle2.addProfile(travelProfile); |
| try { |
| env.beginTransaction(em); |
| em.persist(travelProfile); |
| em.persist(vehicle1); |
| em.persist(vehicle2); |
| env.commitTransactionAndClear(em); |
| Short vehicleId1 = vehicle1.getId(); |
| Short vehicleId2 = vehicle2.getId(); |
| |
| env.beginTransaction(em); |
| travelProfile = em.find(TravelProfile.class, travelProfileId); |
| assertTrue(!cache.contains(Vehicle.class, vehicleId1)); // lazy loading of vehicles |
| assertTrue(!cache.contains(Vehicle.class, vehicleId2)); |
| travelProfile.getVehicles().size(); |
| assertTrue(cache.contains(Vehicle.class, vehicleId1)); |
| assertTrue(cache.contains(Vehicle.class, vehicleId2)); |
| vehicle1 = em.find(Vehicle.class, vehicleId1); |
| vehicle2 = em.find(Vehicle.class, vehicleId2); |
| Set<Vehicle> foundVehicles = travelProfile.getVehicles(); |
| assertTrue(foundVehicles != null); |
| assertTrue("wrong number of vehicles: " + foundVehicles.size(), foundVehicles.size() == 2); |
| Vehicle[] vehicleArray = foundVehicles.toArray(new Vehicle[2]); |
| if (vehicleArray[0].getId().equals(vehicleId1)) { |
| assertTrue("wrong vehicle: " + vehicleArray[1].getId(), vehicleArray[1].getId().equals(vehicleId2)); |
| } else { |
| assertTrue("wrong vehicle: " + vehicleArray[0].getId(), vehicleArray[0].getId().equals(vehicleId2)); |
| assertTrue("wrong vehicle: " + vehicleArray[1].getId(), vehicleArray[1].getId().equals(vehicleId1)); |
| } |
| Set<TravelProfile> travelProfiles1 = vehicle1.getProfiles(); |
| Set<TravelProfile> travelProfiles2 = vehicle2.getProfiles(); |
| assertTrue(travelProfiles1 != null); |
| assertTrue(travelProfiles2 != null); |
| assertTrue(travelProfiles1.size() == 1); |
| assertTrue(travelProfiles2.size() == 1); |
| assertTrue(Arrays.equals(travelProfiles1.toArray(new TravelProfile[1])[0].getGuid(), travelProfileId)); |
| assertTrue(Arrays.equals(travelProfiles2.toArray(new TravelProfile[1])[0].getGuid(), travelProfileId)); |
| travelProfile.setVehicles(null); |
| vehicle1.setProfiles(null); |
| vehicle2.setProfiles(null); |
| env.commitTransactionAndClear(em); |
| |
| assertTrue(!cache.contains(Vehicle.class, vehicleId1)); |
| assertTrue(!cache.contains(Vehicle.class, vehicleId2)); |
| travelProfile = em.find(TravelProfile.class, travelProfileId); |
| vehicle1 = em.find(Vehicle.class, vehicleId1); |
| vehicle2 = em.find(Vehicle.class, vehicleId2); |
| assertTrue(travelProfile.getVehicles().size() == 0); |
| assertTrue(vehicle1.getProfiles().size() == 0); |
| assertTrue(vehicle2.getProfiles().size() == 0); |
| } finally { |
| closeEntityManager(em); |
| } |
| } |
| |
| @Test |
| /** |
| * just for the case that all other methods are skipped |
| */ |
| public void dummyTestMethod() { |
| return; |
| } |
| |
| } |