blob: aff6d2f7872ee376054a47e62318bbeafbf7e823 [file] [log] [blame]
/*
* Copyright (c) 2013, 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:
// Guy Pelletier, dclarke - initial API and implementation
package org.eclipse.persistence.testing.tests.jpa.config;
import static org.eclipse.persistence.config.PersistenceUnitProperties.DDL_DATABASE_GENERATION;
import static org.eclipse.persistence.config.PersistenceUnitProperties.DDL_GENERATION;
import static org.eclipse.persistence.config.PersistenceUnitProperties.DDL_GENERATION_MODE;
import static org.eclipse.persistence.config.PersistenceUnitProperties.DROP_AND_CREATE;
import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_DRIVER;
import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_PASSWORD;
import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_URL;
import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_USER;
import static org.eclipse.persistence.config.PersistenceUnitProperties.LOGGING_LEVEL;
import java.util.Map;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.dynamic.DynamicType;
import org.eclipse.persistence.internal.jpa.config.persistenceunit.PersistenceUnitImpl;
import org.eclipse.persistence.jpa.config.Basic;
import org.eclipse.persistence.jpa.config.ElementCollection;
import org.eclipse.persistence.jpa.config.Embeddable;
import org.eclipse.persistence.jpa.config.Embedded;
import org.eclipse.persistence.jpa.config.Entity;
import org.eclipse.persistence.jpa.config.Id;
import org.eclipse.persistence.jpa.config.JoinTable;
import org.eclipse.persistence.jpa.config.ManyToMany;
import org.eclipse.persistence.jpa.config.ManyToOne;
import org.eclipse.persistence.jpa.config.Mappings;
import org.eclipse.persistence.jpa.config.NamedStoredProcedureQuery;
import org.eclipse.persistence.jpa.config.ObjectTypeConverter;
import org.eclipse.persistence.jpa.config.PersistenceUnit;
import org.eclipse.persistence.jpa.config.RuntimeFactory;
import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCaseHelper;
import org.junit.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* JPA scripting API implementation helper class.
*
* @author Guy Pelletier, Doug Clarke
* @since EclipseLink 2.5.1
*/
public class ConfigPUTestSuite extends JUnitTestCase {
private static EntityManagerFactory emf;
public ConfigPUTestSuite() {
super();
}
public ConfigPUTestSuite(String name) {
super(name);
}
@Override
public void setUp() {
super.setUp();
}
public static Test suite() {
TestSuite suite = new TestSuite();
suite.setName("ConfigPUTestSuite");
suite.addTest(new ConfigPUTestSuite("testCreateConfigPU"));
suite.addTest(new ConfigPUTestSuite("testVerifyConfigPU"));
suite.addTest(new ConfigPUTestSuite("testCRUDConfigPU"));
return suite;
}
public void testCreateConfigPU() {
PersistenceUnit pu = new PersistenceUnitImpl("ConfigPUTestSuite", Thread.currentThread().getContextClassLoader());
// Need to get the user specified database properties.
Map<String, String> properties = JUnitTestCaseHelper.getDatabaseProperties();
pu.setProperty(JDBC_DRIVER, properties.get(JDBC_DRIVER));
pu.setProperty(JDBC_URL, properties.get(JDBC_URL));
pu.setProperty(JDBC_USER, properties.get(JDBC_USER));
pu.setProperty(JDBC_PASSWORD, properties.get(JDBC_PASSWORD));
pu.setProperty(DDL_GENERATION_MODE, DDL_DATABASE_GENERATION);
pu.setProperty(DDL_GENERATION, DROP_AND_CREATE);
pu.setProperty(LOGGING_LEVEL, "FINE");
Mappings mappings = pu.addMappings();
mappings.setPersistenceUnitMetadata().setXmlMappingMetadataComplete(true).setPersitenceUnitDefault().setAccess("VIRTUAL");
mappings.setPackage("org.eclipse.persistence.testing.tests.jpa.config");
mappings.addTypeConverter().setName("String2String").setDataType("String").setObjectType("String");
Entity person = mappings.addEntity().setClass("Person");
person.setTable().setName("CFGPU_PERSON");
Id personId = person.addId();
personId.setName("id").setAttributeType("Integer").setColumn().setName("P_ID");
personId.setGeneratedValue().setStrategy("AUTO");
person.addBasic().setName("name").setAttributeType("String");
/********************************************************************/
/************************** EMPLOYEE ENTITY *************************/
/********************************************************************/
Entity emp = mappings.addEntity().setClass("Employee").setExistenceChecking("CHECK_DATABASE");
emp.setTable().setName("CFGPU_EMPLOYEE");
emp.addSecondaryTable().setName("CFGPU_SALARY").addPrimaryKeyJoinColumn().setName("E_ID").setReferencedColumnName("EMP_ID");
emp.setTableGenerator().setName("CFGPU_EMPLOYEE_TABLE_GENERATOR").setTable("CFGPU_EMPLOYEE_SEQ").setPKColumnName("SEQ_NAME").setValueColumnName("SEQ_COUNT").setPKColumnValue("EMP_SEQ");
emp.addNamedQuery().setName("findAllEmployeesByFirstName").setQuery("SELECT OBJECT(employee) FROM Employee employee WHERE employee.firstName = :firstname");
emp.setChangeTracking().setType("AUTO");
emp.setExcludeDefaultListeners(true);
emp.setExcludeSuperclassListeners(true);
emp.setOptimisticLocking().setType("VERSION_COLUMN").setCascade(true);
emp.setCache().setType("SOFT_WEAK").setSize(730).setIsolation("SHARED").setDisableHits(true).setAlwaysRefresh(false).setCoordinationType("INVALIDATE_CHANGED_OBJECTS").setExpiry(1000);
emp.addEntityListener().setClass("EmployeeListener").setPrePersist("prePersist").setPostPersist("postPersist").setPreRemove("preRemove").setPostRemove("postRemove").setPreUpdate("preUpdate").setPostUpdate("postUpdate").setPostLoad("postLoad");
ObjectTypeConverter sexConverter = emp.addObjectTypeConverter().setName("sex").setDataType("String").setObjectType("Gender");
sexConverter.addConversionValue().setDataValue("F").setObjectValue("Female");
sexConverter.addConversionValue().setDataValue("M").setObjectValue("Male");
emp.addProperty().setName("entityName").setValue("Employee");
emp.addProperty().setName("entityIntegerProperty").setValue("1").setValueType("Integer");
Id employeeId = emp.addId();
employeeId.setName("id").setGeneratedValue().setGenerator("CFGPU_EMPLOYEE_TABLE_GENERATOR").setStrategy("TABLE");
employeeId.setColumn().setName("EMP_ID");
employeeId.setConvert("String2String");
emp.addBasic().setName("firstName").setAttributeType(String.class.getName()).setColumn().setName("F_NAME");
emp.addBasic().setName("lastName").setAttributeType(String.class.getName()).setColumn().setName("L_NAME");
emp.addBasic().setName("sin").setAttributeType("String").setColumn().setName("SIN");
// Access methods?
emp.addBasic().setName("gender").setAttributeType("Gender").setConvert("sex").setColumn().setName("GENDER");
emp.addBasic().setName("salary").setAttributeType(Integer.class.getName()).setColumn().setTable("CFGPU_SALARY");
emp.addBasic().setName("payScale").setAttributeType("SalaryRate").setEnumerated().setType("STRING");
emp.addVersion().setName("version").setAttributeType(Integer.class.getName()).setColumn().setName("VERSION");
ManyToOne addressMapping = emp.addManyToOne().setName("address").setTargetEntity("Address").setFetch("LAZY").setJoinFetch("OUTER");
addressMapping.setCascade().setCascadePersist();
addressMapping.addJoinColumn().setName("ADDR_ID");
ManyToOne managerMapping = emp.addManyToOne().setName("manager").setTargetEntity("Employee").setFetch("LAZY");
managerMapping.setCascade().setCascadePersist();
managerMapping.addJoinColumn().setName("MANAGER_EMP_ID").setReferencedColumnName("EMP_ID");
emp.addOneToMany().setName("phoneNumbers").setTargetEntity("PhoneNumber").setMappedBy("owner").setAttributeType("java.util.Collection").setCascade().setCascadeAll();
emp.addOneToMany().setName("managedEmployees").setTargetEntity("Employee").setMappedBy("manager").setAttributeType("java.util.Collection");
ManyToMany projectsMapping = emp.addManyToMany().setName("projects").setTargetEntity("Project").setOrderBy("name").setAttributeType("java.util.Collection");
projectsMapping.setCascade().setCascadePersist();
JoinTable joinTable = projectsMapping.setJoinTable().setName("CFGPU_PROJ_EMP");
joinTable.addJoinColumn().setName("EMP_ID").setReferencedColumnName("EMP_ID");
joinTable.addInverseJoinColumn().setName("PROJ_ID").setReferencedColumnName("PROJ_ID");
// CreditCards??
// Responsibilities??
ElementCollection creditLinesMapping = emp.addElementCollection().setName("creditLines").setFetch("EAGER").setMapKeyConvert("CreditLine").setConvert("Long2String").setAttributeType("java.util.Map").setTargetClass("Long").setMapKeyClass("String");
creditLinesMapping.addProperty().setName("attributeName").setValue("creditLines");
creditLinesMapping.setColumn().setName("ACCOUNT");
creditLinesMapping.setMapKeyColumn().setName("BANK");
creditLinesMapping.setCollectionTable().setName("CFGPU_EMP_CREDITLINES").addJoinColumn().setName("EMP_ID");
creditLinesMapping.setTypeConverter().setName("Long2String").setDataType("String").setObjectType("Long");
ObjectTypeConverter creditLinesConverter = creditLinesMapping.setObjectTypeConverter().setName("CreditLine");
creditLinesConverter.addConversionValue().setDataValue("RBC").setObjectValue("RoyalBank");
creditLinesConverter.addConversionValue().setDataValue("CIBC").setObjectValue("CanadianImperial");
creditLinesConverter.addConversionValue().setDataValue("SB").setObjectValue("Scotiabank");
creditLinesConverter.addConversionValue().setDataValue("TD").setObjectValue("TorontoDominion");
Embedded periodMapping = emp.addEmbedded().setName("period").setAttributeType("EmploymentPeriod");
periodMapping.addAttributeOverride().setName("startDate").setColumn().setName("START_DATE").setNullable(false);
periodMapping.addAttributeOverride().setName("endDate").setColumn().setName("END_DATE").setNullable(true);
periodMapping.addProperty().setName("attributeName").setValue("period");
// Transformation.
/********************************************************************/
/************************** ADDRESS ENTITY **************************/
/********************************************************************/
Entity address = mappings.addEntity().setClass("Address");
address.setTable().setName("CFGPU_ADDRESS");
address.setChangeTracking().setType("DEFERRED");
address.setCacheInterceptor().setInterceptorClassName("CacheAuditor");
address.setQueryRedirectors().setAllQueriesRedirector("DoNotRedirect").setReadAllRedirector("DoNotRedirect").setReadObjectRedirector("DoNotRedirect").setReportRedirector("DoNotRedirect").setInsertRedirector("DoNotRedirect").setUpdateRedirector("DoNotRedirect").setDeleteRedirector("DoNotRedirect");
address.setSequenceGenerator().setName("CFGPU_ADDRESS_SEQUENCE_GENERATOR").setSequenceName("CFGPU_ADDRESS_SEQ").setAllocationSize(25);
NamedStoredProcedureQuery query = address.addNamedStoredProcedureQuery().setName("SProcAddress").addResultClass("Address").setProcedureName("SProc_Read_Address");
query.addParameter().setMode("IN_OUT").setName("address_id_v").setQueryParameter("ADDRESS_ID").setType("Integer");
query.addParameter().setMode("OUT").setName("street_v").setQueryParameter("STREET").setType("String");
query.addParameter().setMode("OUT").setName("city_v").setQueryParameter("CITY").setType("String");
query.addParameter().setMode("OUT").setName("country_v").setQueryParameter("COUNTRY").setType("String");
query.addParameter().setMode("OUT").setName("province_v").setQueryParameter("PROVINCE").setType("String");
query.addParameter().setMode("OUT").setName("p_code_v").setQueryParameter("P_CODE").setType("String");
address.addNamedNativeQuery().setName("findAllAddresses").setResultClass("Address").setQuery("SELECT * FROM ADDRESS");
Id addressId = address.addId();
addressId.setName("id").setAttributeType("Integer").setColumn().setName("ADDRESS_ID");
addressId.setGeneratedValue().setStrategy("SEQUENCE").setGenerator("CFGPU_ADDRESS_SEQUENCE_GENERATOR");
address.addBasic().setName("postalCode").setAttributeType("String");
address.addBasic().setName("street").setAttributeType("String");
address.addBasic().setName("city").setAttributeType("String");
address.addBasic().setName("province").setAttributeType("String");
address.addBasic().setName("country").setAttributeType("String");
/********************************************************************/
/************************ PHONENUMBER ENTITY ************************/
/********************************************************************/
Entity phoneNumber = mappings.addEntity().setClass("PhoneNumber").setIdClass("PhoneNumberPK");
phoneNumber.setTable().setName("CFGPU_PHONENUMBER");
phoneNumber.addId().setName("id").setAttributeType("Integer").setColumn().setName("OWNER_ID").setInsertable(false).setUpdatable(false);
phoneNumber.addId().setName("type").setAttributeType("String").setColumn().setName("TYPE");
phoneNumber.addBasic().setName("number").setAttributeType("String").setColumn().setName("NUMB");
phoneNumber.addBasic().setName("areaCode").setAttributeType("String").setColumn().setName("AREA_CODE");
phoneNumber.addManyToOne().setName("owner").setTargetEntity("Employee").addJoinColumn().setName("OWNER_ID").setReferencedColumnName("EMP_ID");
/************************** LARGEPROJECT ENTITY **************************/
Entity largeProject = mappings.addEntity().setClass("LargeProject").setParentClass("Project").setExistenceChecking("ASSUME_NON_EXISTENCE");
largeProject.setTable().setName("CFGPU_LPROJECT");
largeProject.setDiscriminatorValue("L");
/********************************************************************/
/*********************** SMALLPROJECT ENTITY ************************/
/********************************************************************/
Entity smallProject = mappings.addEntity().setClass("SmallProject").setParentClass("Project").setExistenceChecking("ASSUME_EXISTENCE");
smallProject.setTable().setName("CFGPU_PROJECT");
smallProject.setDiscriminatorValue("S");
/********************************************************************/
/************************** PROJECT ENTITY **************************/
/********************************************************************/
Entity project = mappings.addEntity().setClass("Project").setExistenceChecking("CHECK_CACHE");
project.setTable().setName("CFGPU_PROJECT");
project.setChangeTracking().setType("OBJECT");
project.setOptimisticLocking().setType("SELECTED_COLUMNS").addSelectedColumn().setName("VERSION");
project.setInheritance().setStrategy("JOINED");
project.setDiscriminatorValue("P").setDiscriminatorColumn().setName("PROJ_TYPE");
project.setSequenceGenerator().setName("CFGPU_PROJECT_SEQUENCE_GENERATOR").setSequenceName("CFGPU_PROJECT_SEQ").setAllocationSize(10);
// TODO: not supported using VIRTUAL.
//project.setPrePersist("prePersist");
//project.setPostPersist("postPersist");
//project.setPreRemove("preRemove");
//project.setPostRemove("postRemove");
//project.setPreUpdate("preUpdate");
//project.setPostUpdate("postUpdate");
//project.setPostLoad("postLoad");
Id projectId = project.addId().setName("id").setAttributeType("Integer");
projectId.setColumn().setName("PROJ_ID");
projectId.setGeneratedValue().setStrategy("SEQUENCE").setGenerator("CFGPU_PROJECT_SEQUENCE_GENERATOR");
project.addBasic().setName("name").setAttributeType("String").setColumn().setName("PROJ_NAME");
project.addBasic().setName("description").setAttributeType("String").setColumn().setName("DESCRIP");
project.addVersion().setName("version").setAttributeType("Integer").setColumn().setName("VERSION");
project.addOneToOne().setName("teamLeader").setTargetEntity("Employee").addJoinColumn().setName("LEADER_ID");
project.addManyToMany().setName("teamMembers").setTargetEntity("Employee").setAttributeType("java.util.List").setMappedBy("projects");
/********************************************************************/
/******************* EMPLOYMENT PERIOD EMBEDDABLE *******************/
/********************************************************************/
Embeddable employmentPeriod = mappings.addEmbeddable().setClass("EmploymentPeriod");
Basic startDate = employmentPeriod.addBasic().setName("startDate").setAttributeType("java.util.Date");
startDate.setColumn().setName("S_DATE");
startDate.setTemporal().setType("DATE");
Basic endDate = employmentPeriod.addBasic().setName("endDate").setAttributeType("java.util.Date");
endDate.setColumn().setName("E_DATE");
endDate.setTemporal().setType("DATE");
emf = RuntimeFactory.getInstance().createEntityManagerFactory(pu);
}
public void testVerifyConfigPU() {
Assert.assertNotNull(emf);
JPADynamicHelper helper = new JPADynamicHelper(emf);
DynamicType personType = helper.getType("Person");
Assert.assertNotNull(personType);
}
public void testCRUDConfigPU() {
EntityManager em = emf.createEntityManager();
try {
JPADynamicHelper helper = new JPADynamicHelper(em);
DynamicType personType = helper.getType("Person");
DynamicEntity person = personType.newDynamicEntity();
person.set("name", "Test");
em.getTransaction().begin();
em.persist(person);
em.getTransaction().commit();
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
em.close();
emf.close();
}
}
}