blob: da9e9e3b42f9a640fec666f4ce0f68511fd063f5 [file] [log] [blame]
/*
* Copyright (c) 1998, 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 from Oracle TopLink
// 01/25/2011-2.3 Guy Pelletier
// - 333913: @OrderBy and <order-by/> without arguments should order by primary
package org.eclipse.persistence.testing.tests.jpa.xml.advanced.compositepk;
import java.util.List;
import java.util.ArrayList;
import jakarta.persistence.Query;
import jakarta.persistence.EntityManager;
import junit.framework.*;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.OneToManyMapping;
import org.eclipse.persistence.queries.DoesExistQuery;
import org.eclipse.persistence.sessions.server.ServerSession;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.advanced.LargeProject;
import org.eclipse.persistence.testing.models.jpa.advanced.Project;
import org.eclipse.persistence.testing.models.jpa.advanced.SmallProject;
import org.eclipse.persistence.testing.models.jpa.xml.advanced.compositepk.*;
import org.eclipse.persistence.testing.models.jpa.xml.advanced.derivedid.*;
import org.eclipse.persistence.testing.models.jpa.xml.advanced.Employee;
import org.eclipse.persistence.testing.models.jpa.xml.advanced.AdvancedTableCreator;
import org.eclipse.persistence.testing.tests.jpa.TestingProperties;
public class AdvancedCompositePKJunitTest extends JUnitTestCase {
String m_persistenceUnit = "default";
private static DepartmentPK m_departmentPK;
private static ScientistPK m_scientist1PK, m_scientist2PK, m_scientist3PK, m_jScientistPK;
public AdvancedCompositePKJunitTest() {
super();
}
public AdvancedCompositePKJunitTest(String name) {
super(name);
}
public AdvancedCompositePKJunitTest(String name, String persistenceUnit) {
super(name);
m_persistenceUnit = persistenceUnit;
}
public static Test suite() {
String ormTesting = TestingProperties.getProperty(TestingProperties.ORM_TESTING, TestingProperties.JPA_ORM_TESTING);
final String persistenceUnit = ormTesting.equals(TestingProperties.JPA_ORM_TESTING)? "default" : "extended-advanced";
TestSuite suite = new TestSuite("AdvancedCompositePKJunitTest - " + persistenceUnit);
suite.addTest(new AdvancedCompositePKJunitTest("testSetup", persistenceUnit));
suite.addTest(new AdvancedCompositePKJunitTest("testOrderBySetting", persistenceUnit));
suite.addTest(new AdvancedCompositePKJunitTest("testCreateDepartment", persistenceUnit));
suite.addTest(new AdvancedCompositePKJunitTest("testCreateScientists", persistenceUnit));
suite.addTest(new AdvancedCompositePKJunitTest("testReadDepartment", persistenceUnit));
suite.addTest(new AdvancedCompositePKJunitTest("testReadJuniorScientist", persistenceUnit));
suite.addTest(new AdvancedCompositePKJunitTest("testAnyAndAll", persistenceUnit));
suite.addTest(new AdvancedCompositePKJunitTest("testDepartmentAdmin", persistenceUnit));
return suite;
}
/**
* The setup is done as a test, both to record its failure, and to allow execution in the server.
*/
public void testSetup() {
new AdvancedTableCreator().replaceTables(JUnitTestCase.getServerSession(m_persistenceUnit));
new CompositePKTableCreator().replaceTables(JUnitTestCase.getServerSession(m_persistenceUnit));
clearCache(m_persistenceUnit);
}
/**
* Verifies that order-by metadata is correctly processed/defaulted.
*/
public void testOrderBySetting() {
ServerSession session = JUnitTestCase.getServerSession(m_persistenceUnit);
ClassDescriptor departmentDescriptor = session.getDescriptor(Department.class);
assertNotNull("Department descriptor was not found.", departmentDescriptor);
DatabaseMapping scientistMapping = departmentDescriptor.getMappingForAttributeName("scientists");
assertNotNull("Scientist mapping from Department descriptor was not found.", scientistMapping);
assertTrue("The scientist mapping from the Department descriptor did not have an order by setting.", ((OneToManyMapping) scientistMapping).hasOrderBy());
}
public void testCreateDepartment() {
EntityManager em = createEntityManager(m_persistenceUnit);
beginTransaction(em);
try {
// make sure the department is not left from the previous test run
em.createQuery("DELETE FROM XMLDepartment d WHERE d.name = 'DEPT A' AND d.role = 'ROLE A' AND d.location = 'LOCATION A'").executeUpdate();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache(m_persistenceUnit);
closeEntityManager(em);
em = createEntityManager(m_persistenceUnit);
beginTransaction(em);
try {
Department department = new Department();
department.setName("DEPT A");
department.setRole("ROLE A");
department.setLocation("LOCATION A");
em.persist(department);
commitTransaction(em);
m_departmentPK = department.getPK();
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
public void testCreateScientists() {
EntityManager em = createEntityManager(m_persistenceUnit);
beginTransaction(em);
try {
Department department = em.merge(em.find(Department.class, m_departmentPK));
Cubicle cubicle1 = new Cubicle("G");
em.persist(cubicle1);
Scientist scientist1 = new Scientist();
scientist1.setFirstName("Guy");
scientist1.setLastName("Pelletier");
scientist1.setCubicle(cubicle1);
department.addScientist(scientist1);
em.persist(scientist1);
Cubicle cubicle2 = new Cubicle("T");
em.persist(cubicle2);
Scientist scientist2 = new Scientist();
scientist2.setFirstName("Tom");
scientist2.setLastName("Ware");
scientist2.setCubicle(cubicle2);
department.addScientist(scientist2);
em.persist(scientist2);
Cubicle cubicle3 = new Cubicle("G");
em.persist(cubicle3);
Scientist scientist3 = new Scientist();
scientist3.setFirstName("Gordon");
scientist3.setLastName("Yorke");
scientist3.setCubicle(cubicle3);
department.addScientist(scientist3);
em.persist(scientist3);
Cubicle cubicle4 = new Cubicle("J");
em.persist(cubicle4);
JuniorScientist jScientist = new JuniorScientist();
jScientist.setFirstName("Junior");
jScientist.setLastName("Sao");
jScientist.setCubicle(cubicle4);
department.addScientist(jScientist);
em.persist(jScientist);
commitTransaction(em);
m_scientist1PK = scientist1.getPK();
m_scientist2PK = scientist2.getPK();
m_scientist3PK = scientist3.getPK();
m_jScientistPK = jScientist.getPK();
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
public void testDepartmentAdmin() {
String location = "Ottawa";
String depName = "New Product Research";
String depRole = "R&D new technologies";
EntityManager em = createEntityManager(m_persistenceUnit);
beginTransaction(em);
try {
Employee emp = new Employee("George", "Smith");
em.persist(emp);
Administrator adminEmp = new Administrator();
adminEmp.setContractCompany("George's consulting");
adminEmp.setEmployee(emp);
em.persist(adminEmp);
Department newProductResearch = new Department();
newProductResearch.setLocation(location);
newProductResearch.setName(depName);
newProductResearch.setRole(depRole);
em.persist(newProductResearch);
DepartmentAdminRole depAdmin = new DepartmentAdminRole();
depAdmin.setAdmin(adminEmp);
depAdmin.setDepartment(newProductResearch);
em.persist(depAdmin);
commitTransaction(em);
org.eclipse.persistence.internal.jpa.EntityManagerImpl emImpl = (org.eclipse.persistence.internal.jpa.EntityManagerImpl) em;
DepartmentAdminRolePK depAdminPk= new DepartmentAdminRolePK(depName, depRole, location, adminEmp.getEmployee().getId());
DepartmentAdminRole cacheObject = em.find(DepartmentAdminRole.class, depAdminPk);
assertTrue("Find did not return the DepartmentAdminRole", cacheObject!=null);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
throw e;
} finally {
closeEntityManager(em);
}
}
public void testReadDepartment() {
Department department = createEntityManager(m_persistenceUnit).find(Department.class, m_departmentPK);
assertTrue("Error on reading back the ordered department list.", department != null);
assertTrue("The number of scientists were incorrect.", department.getScientists().size() > 0);
}
public void testReadJuniorScientist() {
JuniorScientist jScientist;
jScientist = createEntityManager(m_persistenceUnit).find(JuniorScientist.class, m_jScientistPK);
assertTrue("Error on reading back the junior scientist.", jScientist != null);
}
//bug gf672 - JBQL Select query with IN/ANY in WHERE clause and subselect fails.
public void testAnyAndAll() {
EntityManager em = createEntityManager(m_persistenceUnit);
beginTransaction(em);
try {
Query query1 = em.createQuery("SELECT s FROM XMLScientist s WHERE s = ANY (SELECT s2 FROM XMLScientist s2)");
List<Scientist> results1 = query1.getResultList();
Query query2 = em.createQuery("SELECT s FROM XMLScientist s WHERE s = ALL (SELECT s2 FROM XMLScientist s2)");
List<Scientist> results2 = query2.getResultList();
Query query3 = em.createQuery("SELECT s FROM XMLScientist s WHERE s.department = ALL (SELECT DISTINCT d FROM XMLDepartment d WHERE d.name = 'DEPT A' AND d.role = 'ROLE A' AND d.location = 'LOCATION A')");
List<Scientist> results3 = query3.getResultList();
Query query4 = em.createQuery("SELECT s FROM XMLScientist s WHERE s.department = ANY (SELECT DISTINCT d FROM XMLDepartment d JOIN d.scientists ds JOIN ds.cubicle c WHERE c.code = 'G')");
List<Scientist> results4 = query4.getResultList();
// control queries
Query controlQuery1 = em.createQuery("SELECT s FROM XMLScientist s");
List<Scientist> controlResults1 = controlQuery1.getResultList();
List<Scientist> controlResults2;
if(controlResults1.size() == 1) {
controlResults2 = controlResults1;
} else {
controlResults2 = new ArrayList<Scientist>();
}
Query controlQuery3 = em.createQuery("SELECT s FROM XMLScientist s JOIN s.department d WHERE d.name = 'DEPT A' AND d.role = 'ROLE A' AND d.location = 'LOCATION A'");
List<Scientist> controlResults3 = controlQuery3.getResultList();
Query controlQuery4 = em.createQuery("SELECT s FROM XMLScientist s WHERE EXISTS (SELECT DISTINCT d FROM XMLDepartment d JOIN d.scientists ds JOIN ds.cubicle c WHERE c.code = 'G' AND d = s.department)");
List<Scientist> controlResults4 = controlQuery4.getResultList();
//compare results - they should be the same
compareResults(results1, controlResults1, "query1");
compareResults(results2, controlResults2, "query2");
compareResults(results3, controlResults3, "query3");
compareResults(results4, controlResults4, "query4");
} finally {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
}
}
protected void compareResults(List results, List controlResults, String testName) {
if(results.size() != controlResults.size()) {
fail(testName + ": results.size() = " + results.size() + "; controlResults.size() = " + controlResults.size());
}
for (Object s : results) {
if(!controlResults.contains(s)) {
fail(testName + ": " + s + "contained in results but not in controlResults");
}
}
}
}