blob: a4e65bc266dadbf0f30e04f45f8b863387586054 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2018 IBM Corporation. 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
// 04/24/2009-2.0 Guy Pelletier
// - 270011: JPA 2.0 MappedById support
// 10/21/2009-2.0 Guy Pelletier
// - 290567: mappedbyid support incomplete
// 11/23/2009-2.0 Guy Pelletier
// - 295790: JPA 2.0 adding @MapsId to one entity causes initialization errors in other entities
// 05/31/2010-2.1 Guy Pelletier
// - 314941: multiple joinColumns without referenced column names defined, no error
// 01/25/2011-2.3 Guy Pelletier
// - 333913: @OrderBy and <order-by/> without arguments should order by primary
// 09/11/2017-2.1 Will Dazey
// - 520387: multiple owning descriptors for an embeddable are not set
package org.eclipse.persistence.testing.tests.jpa.advanced.compositepk;
import java.util.List;
import java.util.ArrayList;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.PersistenceException;
import jakarta.persistence.PersistenceUnitUtil;
import jakarta.persistence.Query;
import jakarta.persistence.EntityManager;
import junit.framework.*;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.internal.databaseaccess.DatabasePlatform;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.OneToManyMapping;
import org.eclipse.persistence.sessions.CopyGroup;
import org.eclipse.persistence.sessions.server.ServerSession;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.Author;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.Book;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.Competency;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.Cubicle;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.JuniorScientist;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.Office;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.OfficePK;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.Scientist;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.ScientistPK;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.Department;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.DepartmentPK;
import org.eclipse.persistence.testing.models.jpa.advanced.compositepk.CompositePKTableCreator;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.AdminPool;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.Bookie;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.BrigadierGeneral;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.Captain;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.CaptainId;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.CellNumber;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.CellNumberPK;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.Corporal;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.CorporalId;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.DepartmentAdminRole;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.DepartmentAdminRolePK;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.Administrator;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.General;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.Lackey;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.LackeyCrewMember;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.LackeyCrewMemberId;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.Lieutenant;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.LieutenantGeneral;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.LieutenantId;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.Major;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.MajorGeneral;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.MajorId;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.MasterCorporal;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.MasterCorporalClone;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.MasterCorporalId;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.OfficerCadet;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.Private;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.PrivateId;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.Sargeant;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.SecondLieutenant;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.nested.GolfClub;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.nested.GolfClubHead;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.nested.GolfClubOrder;
import org.eclipse.persistence.testing.models.jpa.advanced.derivedid.nested.GolfClubShaft;
import org.eclipse.persistence.testing.models.jpa.complexaggregate.Body;
import org.eclipse.persistence.testing.models.jpa.complexaggregate.Heart;
import org.eclipse.persistence.testing.models.jpa.complexaggregate.Torso;
import org.eclipse.persistence.testing.models.jpa.advanced.Employee;
import org.eclipse.persistence.testing.models.jpa.advanced.AdvancedTableCreator;
public class AdvancedCompositePKJunitTest extends JUnitTestCase {
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 static Test suite() {
TestSuite suite = new TestSuite();
suite.setName("AdvancedCompositePKJunitTest");
suite.addTest(new AdvancedCompositePKJunitTest("testSetup"));
suite.addTest(new AdvancedCompositePKJunitTest("testOrderBySetting"));
suite.addTest(new AdvancedCompositePKJunitTest("testCreateDepartment"));
suite.addTest(new AdvancedCompositePKJunitTest("testCreateScientists"));
suite.addTest(new AdvancedCompositePKJunitTest("testReadDepartment"));
suite.addTest(new AdvancedCompositePKJunitTest("testReadJuniorScientist"));
suite.addTest(new AdvancedCompositePKJunitTest("testAnyAndAll"));
suite.addTest(new AdvancedCompositePKJunitTest("testDepartmentAdmin"));
// MappedById tests (see spec page 30 for more info)
suite.addTest(new AdvancedCompositePKJunitTest("testMapsIdExample1"));
suite.addTest(new AdvancedCompositePKJunitTest("testMapsIdExample1b"));
suite.addTest(new AdvancedCompositePKJunitTest("testMapsIdExample2"));
suite.addTest(new AdvancedCompositePKJunitTest("testMapsIdExample3"));
suite.addTest(new AdvancedCompositePKJunitTest("testMapsIdExample4"));
suite.addTest(new AdvancedCompositePKJunitTest("testMapsIdExample5"));
suite.addTest(new AdvancedCompositePKJunitTest("testMapsIdExample5a"));
suite.addTest(new AdvancedCompositePKJunitTest("testMapsIdExample6"));
suite.addTest(new AdvancedCompositePKJunitTest("testMapsIdExample6MultiLevel"));
suite.addTest(new AdvancedCompositePKJunitTest("testJoinColumnSharesPK"));
suite.addTest(new AdvancedCompositePKJunitTest("testMapWithDerivedId"));
suite.addTest(new AdvancedCompositePKJunitTest("testIdentitySequencingForDerivedId"));
suite.addTest(new AdvancedCompositePKJunitTest("testSharedDerivedIdEmbeddableClass"));
suite.addTest(new AdvancedCompositePKJunitTest("testNestedMapsId"));
suite.addTest(new AdvancedCompositePKJunitTest("testCopyAggregateCollection"));
if (!isJPA10()) {
// This test runs only on a JEE6 / JPA 2.0 capable server
suite.addTest(new AdvancedCompositePKJunitTest("testGetIdentifier"));
suite.addTest(new AdvancedCompositePKJunitTest("testFailedGetIdenitifier"));
suite.addTest(new AdvancedCompositePKJunitTest("testGetIdenitifierOnNonEntity"));
suite.addTest(new AdvancedCompositePKJunitTest("testNestedEmbeddableSequenceGeneration"));
}
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 CompositePKTableCreator().replaceTables(JUnitTestCase.getServerSession());
new AdvancedTableCreator().replaceTables(JUnitTestCase.getServerSession());
clearCache();
}
/**
* Verifies that order-by metadata is correctly processed/defaulted.
*/
public void testOrderBySetting() {
ServerSession session = JUnitTestCase.getServerSession();
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();
beginTransaction(em);
try {
// make sure the department is not left from the previous test run
em.createQuery("DELETE FROM Department 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();
closeEntityManager(em);
em = createEntityManager();
beginTransaction(em);
try {
Department department = new Department();
department.setName("DEPT A");
department.setRole("ROLE A");
department.setLocation("LOCATION A");
Competency competency = new Competency();
competency.description = "Manage groups";
competency.rating = 9;
department.addCompetency(competency);
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();
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();
beginTransaction(em);
try {
Employee emp = new Employee();
emp.setFirstName("George");
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);
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().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().find(JuniorScientist.class, m_jScientistPK);
assertTrue("Error on reading back the junior scientist.", jScientist != null);
}
//bug gf672 - JPQL Select query with IN/ANY in WHERE clause and subselect fails.
public void testAnyAndAll() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
Query query1 = em.createQuery("SELECT s FROM Scientist s WHERE s = ANY (SELECT s2 FROM Scientist s2)");
List<Scientist> results1 = query1.getResultList();
Query query2 = em.createQuery("SELECT s FROM Scientist s WHERE s = ALL (SELECT s2 FROM Scientist s2)");
List<Scientist> results2 = query2.getResultList();
Query query3 = em.createQuery("SELECT s FROM Scientist s WHERE s.department = ALL (SELECT DISTINCT d FROM Department 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 Scientist s WHERE s.department = ANY (SELECT DISTINCT d FROM Department 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 Scientist 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 Scientist 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 Scientist s WHERE EXISTS (SELECT DISTINCT d FROM Department 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");
}
}
}
public void testMapsIdExample1() {
EntityManager em = createEntityManager();
beginTransaction(em);
Sargeant sargeant = new Sargeant();
MasterCorporal masterCorporal = new MasterCorporal();
MasterCorporalId masterCorporalId = new MasterCorporalId();
try {
sargeant.setName("Sarge");
masterCorporalId.setName("Corpie");
masterCorporal.setId(masterCorporalId);
masterCorporal.setSargeant(sargeant);
// Sargeant is cascade persist.
em.persist(masterCorporal);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
Sargeant refreshedSargeant = em.find(Sargeant.class, sargeant.getSargeantId());
assertTrue("The sargeant read back did not match the original", getServerSession().compareObjects(sargeant, refreshedSargeant));
MasterCorporal refreshedMasterCorporal = em.find(MasterCorporal.class, masterCorporalId);
assertTrue("The master corporal read back did not match the original", getServerSession().compareObjects(masterCorporal, refreshedMasterCorporal));
}
public void testMapsIdExample1b() {
EntityManager em = createEntityManager();
beginTransaction(em);
Sargeant sargeant = new Sargeant();
MasterCorporal masterCorporal = new MasterCorporal();
try {
sargeant.setName("SargeB");
masterCorporal.setSargeant(sargeant);
// We don't set the master corporal id, only the maps id mapping
// sargeant. After persist, the master corporal id should be
// created for us with the derived id set.
// Sargeant is cascade persist.
em.persist(masterCorporal);
// Now set the other part of the master corporal id (name) before
// commit.
masterCorporal.getId().setName("CorpieB");
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
Sargeant refreshedSargeant = em.find(Sargeant.class, sargeant.getSargeantId());
assertTrue("The sargeant read back did not match the original", getServerSession().compareObjects(sargeant, refreshedSargeant));
MasterCorporal refreshedMasterCorporal = em.find(MasterCorporal.class, masterCorporal.getId());
assertTrue("The master corporal read back did not match the original", getServerSession().compareObjects(masterCorporal, refreshedMasterCorporal));
}
public void testMapsIdExample2() {
EntityManager em = createEntityManager();
beginTransaction(em);
Major major = new Major();
MajorId majorId;
Captain captain = new Captain();
CaptainId captainId = new CaptainId();
try {
major.setFirstName("Mr.");
major.setLastName("Major");
majorId = major.getPK();
em.persist(major);
captainId.setName("Captain Sparrow");
captain.setId(captainId);
captain.setMajor(major);
em.persist(captain);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
Major refreshedMajor = em.find(Major.class, majorId);
assertTrue("The major read back did not match the original", getServerSession().compareObjects(major, refreshedMajor));
Captain refreshedCaptain = em.find(Captain.class, captainId);
assertTrue("The captain read back did not match the original", getServerSession().compareObjects(captain, refreshedCaptain));
}
public void testMapsIdExample3() {
EntityManager em = createEntityManager();
beginTransaction(em);
Corporal corporal = new Corporal();
CorporalId corporalId = new CorporalId();
Private aPrivate = new Private();
PrivateId privateId = new PrivateId();
try {
corporalId.setFirstName("Corporal");
corporalId.setLastName("Kenny");
corporal.setCorporalId(corporalId);
em.persist(corporal);
privateId.setName("Private Ryan");
aPrivate.setId(privateId);
aPrivate.setCorporal(corporal);
em.persist(aPrivate);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
Corporal refreshedCorporal = em.find(Corporal.class, corporalId);
assertTrue("The corporal read back did not match the original", getServerSession().compareObjects(corporal, refreshedCorporal));
Private refreshedPrivate = em.find(Private.class, privateId);
assertTrue("The private read back did not match the original", getServerSession().compareObjects(aPrivate, refreshedPrivate));
}
public void testMapsIdExample4() {
EntityManager em = createEntityManager();
beginTransaction(em);
General general = new General();
LieutenantGeneral lieutenantGeneral = new LieutenantGeneral();
try {
em.persist(general);
lieutenantGeneral.setGeneral(general);
em.persist(lieutenantGeneral);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
General refreshedGeneral = em.find(General.class, general.getGeneralId());
assertTrue("The general read back did not match the original", getServerSession().compareObjects(general, refreshedGeneral));
LieutenantGeneral refreshedLieutenantGeneral = em.find(LieutenantGeneral.class, lieutenantGeneral.getId());
assertTrue("The lieutenant general read back did not match the original", getServerSession().compareObjects(lieutenantGeneral, refreshedLieutenantGeneral));
}
public void testMapsIdExample5() {
EntityManager em = createEntityManager();
beginTransaction(em);
MajorGeneral majorGeneral = new MajorGeneral();
BrigadierGeneral brigadierGeneral = new BrigadierGeneral();
try {
majorGeneral.setFirstName("Major");
majorGeneral.setLastName("Bilko");
// Test the cascade persist on this mapping.
brigadierGeneral.setMajorGeneral(majorGeneral);
em.persist(brigadierGeneral);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
MajorGeneral refreshedMajorGeneral = em.find(MajorGeneral.class, majorGeneral.getPK());
assertTrue("The major general read back did not match the original", getServerSession().compareObjects(majorGeneral, refreshedMajorGeneral));
BrigadierGeneral refreshedBrigadierGeneral = em.find(BrigadierGeneral.class, brigadierGeneral.getId());
assertTrue("The brigadier general read back did not match the original", getServerSession().compareObjects(brigadierGeneral, refreshedBrigadierGeneral));
}
public void testMapsIdExample5a() {
EntityManager em = createEntityManager();
beginTransaction(em);
Major major = new Major();
major.setFirstName("Another");
major.setLastName("Major");
MajorId majorId = major.getPK();
Lackey lackey = new Lackey();
LackeyCrewMember lcm = new LackeyCrewMember();
LackeyCrewMemberId lcmId = new LackeyCrewMemberId();
lcm.setLackey(lackey);
lcm.setRank(1);
lcmId.setRank(1);
lcmId.setMajorPK(majorId);
try {
em.persist(major);
lackey.setMajor(major);
lackey.setName("Little");
em.persist(lackey);
em.persist(lcm);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
Major refreshedMajor = em.find(Major.class, majorId);
assertTrue("The major read back did not match the original", getServerSession().compareObjects(major, refreshedMajor));
Lackey refreshedLackey = em.find(Lackey.class, majorId);
assertTrue("The Lackey read back did not match the original", getServerSession().compareObjects(lackey, refreshedLackey));
LackeyCrewMember refreshedLCM = em.find(LackeyCrewMember.class, lcmId);
assertTrue("The LackeyCrewMember read back did not match the original", getServerSession().compareObjects(lcm, refreshedLCM));
}
public void testMapsIdExample6() {
EntityManager em = createEntityManager();
beginTransaction(em);
Lieutenant lieutenant = new Lieutenant();
LieutenantId lieutenantId = new LieutenantId();
SecondLieutenant secondLieutenant = new SecondLieutenant();
try {
lieutenantId.setFirstName("Lieutenant");
lieutenantId.setLastName("Dan");
lieutenant.setId(lieutenantId);
em.persist(lieutenant);
em.persist(secondLieutenant);
secondLieutenant.setLieutenant(lieutenant);
em.flush();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
Lieutenant refreshedLieutenant = em.find(Lieutenant.class, lieutenant.getId());
assertTrue("The lieutenant read back did not match the original", getServerSession().compareObjects(lieutenant, refreshedLieutenant));
SecondLieutenant refreshedSecondLieutenant = em.find(SecondLieutenant.class, secondLieutenant.getId());
assertTrue("The second lieutenant read back did not match the original", getServerSession().compareObjects(secondLieutenant, refreshedSecondLieutenant));
}
public void testMapsIdExample6MultiLevel() {
EntityManager em = createEntityManager();
beginTransaction(em);
Lieutenant lieutenant = new Lieutenant();
LieutenantId lieutenantId = new LieutenantId();
SecondLieutenant secondLieutenant = new SecondLieutenant();
OfficerCadet officerCadet = new OfficerCadet();
try {
lieutenantId.setFirstName("Lieutenant");
lieutenantId.setLastName("Daniel");
lieutenant.setId(lieutenantId);
em.persist(lieutenant);
em.persist(secondLieutenant);
secondLieutenant.setLieutenant(lieutenant);
officerCadet.setSecondLieutenant(secondLieutenant);
em.persist(officerCadet);
em.flush();
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
Lieutenant refreshedLieutenant = em.find(Lieutenant.class, lieutenant.getId());
assertTrue("The lieutenant read back did not match the original", getServerSession().compareObjects(lieutenant, refreshedLieutenant));
SecondLieutenant refreshedSecondLieutenant = em.find(SecondLieutenant.class, secondLieutenant.getId());
assertTrue("The second lieutenant read back did not match the original", getServerSession().compareObjects(secondLieutenant, refreshedSecondLieutenant));
OfficerCadet refreshedOfficerCadet = em.find(OfficerCadet.class, officerCadet.getId());
assertTrue("The officer cadet read back did not match the original", getServerSession().compareObjects(officerCadet, refreshedOfficerCadet));
}
public void testGetIdentifier(){
EntityManagerFactory emf = getEntityManagerFactory();
EntityManager em = createEntityManager();
beginTransaction(em);
try{
DepartmentPK pk = new DepartmentPK("DEPT B", "ROLE B", "LOCATION B");
Department department = new Department();
department.setName("DEPT B");
department.setRole("ROLE B");
department.setLocation("LOCATION B");
em.persist(department);
em.flush();
PersistenceUnitUtil util = emf.getPersistenceUnitUtil();
assertTrue("Got an incorrect id from persistenceUtil.getIdentifier()", pk.equals(util.getIdentifier(department)));
} finally {
rollbackTransaction(em);
}
}
public void testJoinColumnSharesPK(){
EntityManagerFactory emf = getEntityManagerFactory();
EntityManager em = createEntityManager();
beginTransaction(em);
org.eclipse.persistence.descriptors.ClassDescriptor descriptor = getServerSession().getDescriptor(Office.class);
try{
Department department = new Department();
department.setName("DEPT B");
department.setRole("ROLE B");
department.setLocation("LOCATION B");
em.persist(department);
Office office = new Office();
office.setId(1);
office.setLocation("LOCATION B");
office.setDepartment(department);
em.persist(office);
department.getOffices().add(office);
em.flush();
clearCache();
office = em.find(Office.class, new OfficePK(1, "LOCATION B"));
department = em.find(Department.class, new DepartmentPK("DEPT B", "ROLE B", "LOCATION B"));
assertTrue("Office's department not properly persisted", office.getDepartment() != null);
assertTrue("Department's offices not properly persisted", department.getOffices().size() > 0);
} catch (Exception e){
fail("Exception thrown while inserting an object with a read-only column in a foreign key." + e);
} finally {
rollbackTransaction(em);
}
}
public void testMapWithDerivedId(){
EntityManagerFactory emf = getEntityManagerFactory();
EntityManager em = createEntityManager();
beginTransaction(em);
try{
Employee emp = new Employee();
emp.setFirstName("George");
em.persist(emp);
Administrator adminEmp = new Administrator();
adminEmp.setContractCompany("George's consulting");
adminEmp.setEmployee(emp);
em.persist(adminEmp);
Department support = new Department();
support.setLocation("Ottawa");
support.setName("Support");
support.setRole("Support Customers");
em.persist(support);
DepartmentAdminRole depAdmin = new DepartmentAdminRole();
depAdmin.setAdmin(adminEmp);
depAdmin.setDepartment(support);
em.persist(depAdmin);
AdminPool pool = new AdminPool();
pool.setId(1);
pool.addAdmin(depAdmin);
depAdmin.setPool(pool);
em.persist(pool);
em.flush();
em.clear();
clearCache();
pool = em.find(AdminPool.class, pool.getId());
assertTrue("The AdminPool was not found.", pool != null);
assertTrue("The map did not contain the correct elements.", pool.getAdmins().get(depAdmin.buildDepartmentAdminRolePK()) != null);
} catch (Exception e) {
fail("Exception caught while testing maps with derived ids." + e);
} finally {
rollbackTransaction(em);
closeEntityManager(em);
}
}
public void testIdentitySequencingForDerivedId() {
EntityManager em = createEntityManager();
beginTransaction(em);
Bookie bookie = new Bookie();
try {
bookie.setName("Bookie Joe");
CellNumber cellNumber1 = new CellNumber();
cellNumber1.setNumber("613-765-6452");
cellNumber1.setDescription("NHL bets");
bookie.addCellNumber(cellNumber1);
CellNumber cellNumber2 = new CellNumber();
cellNumber2.setNumber("613-765-6222");
cellNumber2.setDescription("NB@ bets");
bookie.addCellNumber(cellNumber2);
// Bookie has cascade persist to cell number;
em.persist(bookie);
// Flush the changes.
em.flush();
// Make some changes.
CellNumber cellNumber3 = new CellNumber();
cellNumber3.setNumber("613-765-7422");
cellNumber3.setDescription("PGA bets");
bookie.addCellNumber(cellNumber3);
em.persist(cellNumber3);
// Flush the changes.
em.flush();
// Make some changes.
bookie.setName("Bookie Jo");
cellNumber2.setDescription("NBA bets");;
// Flush the changes.
em.flush();
// Do some finds
CellNumber findCellNumber1 = em.find(CellNumber.class, cellNumber1.buildPK());
assertNotNull(findCellNumber1);
CellNumberPK key = cellNumber2.buildPK();
CellNumber findCellNumber2 = em.find(CellNumber.class, key);
assertNotNull(findCellNumber2);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
public void testSharedDerivedIdEmbeddableClass() {
EntityManager em = createEntityManager();
beginTransaction(em);
MasterCorporalClone masterCorporal = new MasterCorporalClone();
try {
MasterCorporalId masterCorporalId = new MasterCorporalId();
masterCorporalId.setName("MCC " + System.currentTimeMillis());
masterCorporalId.setSargeantPK(System.currentTimeMillis());
masterCorporal.setId(masterCorporalId);
em.persist(masterCorporal);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)){
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
clearCache();
em = createEntityManager();
MasterCorporalClone refreshedMasterCorporal = em.find(MasterCorporalClone.class, masterCorporal.getId());
assertTrue("The master corporal clone read back did not match the original", getServerSession().compareObjects(masterCorporal, refreshedMasterCorporal));
}
public void testNestedMapsId() {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
GolfClubHead head = new GolfClubHead();
em.persist(head);
GolfClubShaft shaft = new GolfClubShaft();
em.persist(shaft);
GolfClub golfClub = new GolfClub();
golfClub.setHead(head);
golfClub.setShaft(shaft);
GolfClubOrder golfClubOrder = new GolfClubOrder();
golfClubOrder.setGolfClub(golfClub);
golfClub.setOrder(golfClubOrder);
em.persist(golfClub);
em.persist(golfClubOrder);
commitTransaction(em);
} catch (RuntimeException e) {
if (isTransactionActive(em)) {
rollbackTransaction(em);
}
closeEntityManager(em);
throw e;
}
}
// Bug 406957 - Copy fails on AggregateCollectionMapping and on map with @MapKeyColumn
public void testCopyAggregateCollection() {
Department department = new Department();
department.setName("DEPT AggregateCollection");
department.setRole("ROLE AggregateCollection");
department.setLocation("LOCATION AggregateCollection");
Competency competency = new Competency();
competency.description = "Manage groups";
competency.rating = 9;
department.addCompetency(competency);
EntityManager em = createEntityManager();
CopyGroup privatelyOwned = new CopyGroup();
Department departmentCopy = (Department)JpaHelper.getEntityManager(em).copy(department, privatelyOwned);
if (departmentCopy.getCompetencies().size() != department.getCompetencies().size()) {
fail("departmentCopy.getCompetencies().size() = " + departmentCopy.getCompetencies().size() + "; "+department.getCompetencies().size()+" was expected");
}
if (departmentCopy.getCompetencies() == department.getCompetencies()) {
fail("departmentCopy.getCompetencies() == department.getCompetencies()");
}
Competency copmetencyCopy = departmentCopy.getCompetencies().iterator().next();
if (!competency.description.equals(copmetencyCopy.description)) {
fail("competency.descripton = " + competency.description +"; but copmetencyCopy.description = " + copmetencyCopy.description);
}
}
// bug 409579
public void testFailedGetIdenitifier(){
EntityManagerFactory factory = getEntityManagerFactory();
Cubicle cube = new Cubicle();
cube.setId(1);
cube.setCode("a");
try{
factory.getPersistenceUnitUtil().getIdentifier(cube);
} catch (PersistenceException e){
return;
}
fail("Exception not thrown for call to getIdentifier when empty constructor not available.");
}
// bug 421557
public void testGetIdenitifierOnNonEntity(){
EntityManagerFactory factory = getEntityManagerFactory();
Object nonEntity = new Object();
try{
factory.getPersistenceUnitUtil().getIdentifier(nonEntity);
} catch (IllegalArgumentException e){
return;
}
fail("IllegalArgumentException not thrown for call to getIdentifier with a non-entity class.");
}
// bug 520387
public void testNestedEmbeddableSequenceGeneration(){
if(!supportsSequenceObjects()) {
return;
}
Book b = new Book("Book1");
Author a = new Author("Author1");
EntityManager em = createEntityManager();
beginTransaction(em);
b = em.merge(b);
a = em.merge(a);
assertTrue("The PK value for "+ b.getClass() +" (" + b.getId().getNumberId().getValue() + ") is not sequence generated", (b.getId().getNumberId().getValue() >= 1000L));
assertTrue("The PK value for "+ a.getClass() +" (" + a.getId().getNumberId().getValue() + ") is not sequence generated", (a.getId().getNumberId().getValue() >= 1000L));
rollbackTransaction(em);
}
}