blob: 9adf91c4b878ab9fb266ecd6204479e406534752 [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:
// 02/01/2012-2.4 Chris Delahunt
// - 368365: add DDL support to alter existing tables to add missing fields
package org.eclipse.persistence.testing.tests.jpa.ddlgeneration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceException;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.exceptions.DatabaseException;
import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.tools.schemaframework.DefaultTableGenerator;
import org.eclipse.persistence.tools.schemaframework.TableCreator;
public class DDLGenerationExtendTablesJUnitTestSuite extends
DDLGenerationJUnitTestSuite {
public DDLGenerationExtendTablesJUnitTestSuite() {
}
public DDLGenerationExtendTablesJUnitTestSuite(String name) {
super(name);
setPuName(DDL_PU);
}
/**
* The setup is done as a test, both to record its failure, and to allow execution in the server.
*/
@Override
public void testSetup() {
// Create the EM. This might unnecessarily drop and create the tables
EntityManager em = createEntityManager(DDL_PU);
DatabaseSessionImpl session = getDatabaseSession(DDL_PU);
TableCreator defaultTableCreator = new DefaultTableGenerator(session.getProject(), true).generateDefaultTableCreator();
defaultTableCreator.setIgnoreDatabaseException(true);
//drop the tables using the current project
defaultTableCreator.dropTables(session);
//check that the tables do not exist:
Exception exception = null;
try {
em.createQuery("Select c from Course c").getResultList();
} catch (DatabaseException caught){
//we expect an exception since the table should not exist, but do not know what exception the database might throw.
exception = caught;
} catch (PersistenceException e){
exception = e;
}
assertNotNull("setup failed because a query on a drop table did not throw an exception.", exception);
//create some empty tables so that we can test they are altered correctly later.
TableCreator tbCreator = new EmptyTableCreator();
tbCreator.createTables(session);
//refresh the metadata with the create-or-alter table to create the remaining tables and alter the ones created above.
//testing later on just verifies that this worked correctly.
Map properties = new HashMap();
properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.CREATE_OR_EXTEND);
//create-or-extend only works on the database
properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION);
//this causes DDL generation to occur on refreshMetadata rather than wait until an em is obtained
properties.put(PersistenceUnitProperties.DEPLOY_ON_STARTUP, "true");
// JEE requires a transaction to keep the em open.
beginTransaction(em);
JpaHelper.getEntityManagerFactory(em).refreshMetadata(properties);
commitTransaction(em);
closeEntityManager(em);
clearCache(DDL_PU);
}
public static Test suite() {
if (System.getProperty("server.platform") != null) {
// "MulitPU-1" is the persistence unit name used on servers
DDL_PU = "MulitPU-1";
}
TestSuite suite = new TestSuite();
suite.setName("DDLCreateAndAlterTablesTestSuite");
// 'create-or-extend-tables' cannot be tested properly if 'toggle-fast-table-creator' is set as true.
// DELETE FROM TABLE is executed instead of DROP TABLE / CREATE TABLE when 'toggle-fast-table-creator' is set as true.
// Skip this test suite if 'toggle-fast-table-creator' is set as true. (bug 372179)
if (Boolean.getBoolean("eclipselink.test.toggle-fast-table-creator")) {
return suite;
}
suite.addTest(new DDLGenerationExtendTablesJUnitTestSuite("testSetup"));
List<String> tests = new ArrayList<String>();
tests.add("testDDLPkConstraintErrorIncludingRelationTableColumnName");
tests.add("testOptionalPrimaryKeyJoinColumnRelationship");
tests.add("testPrimaryKeyJoinColumns");
tests.add("testDDLEmbeddableMapKey");
tests.add("testDDLAttributeOverrides");
tests.add("testDDLAttributeOverridesOnElementCollection");
tests.add("testDDLUniqueKeysAsJoinColumns");
tests.add("testDDLUniqueConstraintsByAnnotations");
tests.add("testDDLUniqueConstraintsByXML");
tests.add("testDDLSubclassEmbeddedIdPkColumnsInJoinedStrategy");
tests.add("testBug241308");
tests.add("testDDLUnidirectionalOneToMany");
tests.add("testCascadeMergeOnManagedEntityWithOrderedList");
tests.add("testDirectCollectionMapping");
tests.add("testAggregateCollectionMapping");
tests.add("testOneToManyMapping");
tests.add("testUnidirectionalOneToManyMapping");
tests.add("testManyToManyMapping");
tests.add("testManyToManyWithMultipleJoinColumns");
tests.add("testEmbeddedManyToMany");
tests.add("testEmbeddedOneToOne");
tests.add("testAssociationOverrideToEmbeddedManyToMany");
tests.add("testDeleteObjectWithEmbeddedManyToMany");
tests.add("testLAZYLOBWithEmbeddedId");
tests.add("testElementMapOnEmbedded");
if (! JUnitTestCase.isJPA10()) {
tests.add("testCreateMafiaFamily707");
tests.add("testCreateMafiaFamily007");
tests.add("testValidateMafiaFamily707");
tests.add("testValidateMafiaFamily007");
}
tests.add("testSimpleSelectFoo");
for (String test : tests) {
suite.addTest(new DDLGenerationExtendTablesJUnitTestSuite(test));
}
return suite;
}
public class EmptyTableCreator extends TableCreator {
public EmptyTableCreator() {
org.eclipse.persistence.tools.schemaframework.TableDefinition tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();
// SECTION: TABLE
tabledefinition.setName("Countries");
// SECTION: ID FIELD
org.eclipse.persistence.tools.schemaframework.FieldDefinition field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field.setName("iso_code");
field.setType(String.class);
field.setSize(50);
field.setShouldAllowNull(false);
field.setIsPrimaryKey(true);
field.setUnique(false);
field.setIsIdentity(true);
tabledefinition.addField(field);
addTableDefinition(tabledefinition);
// SECTION: TABLE
tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();
tabledefinition.setName("DDL_EMP");
// SECTION: ID FIELD
field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field.setName("ID");
field.setType(Integer.class);
field.setShouldAllowNull(false);
field.setIsPrimaryKey(true);
field.setUnique(false);
field.setIsIdentity(true);
tabledefinition.addField(field);
addTableDefinition(tabledefinition);
// SECTION: TABLE
tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();
tabledefinition.setName("DDL_COURSE");
// SECTION: ID FIELD
field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field.setName("ID");
field.setType(Long.class);
field.setShouldAllowNull(false);
field.setIsPrimaryKey(true);
field.setUnique(false);
field.setIsIdentity(true);
tabledefinition.addField(field);
addTableDefinition(tabledefinition);
// SECTION: TABLE
tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();
tabledefinition.setName("Foos");
// SECTION: ID FIELD
field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field.setName("contact_id");
field.setType(Integer.class);
field.setShouldAllowNull(false);
field.setIsPrimaryKey(true);
field.setUnique(false);
field.setIsIdentity(true);
tabledefinition.addField(field);
field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field.setName("ordinal_nbr");
field.setType(Integer.class);
field.setShouldAllowNull(false);
field.setIsPrimaryKey(true);
field.setUnique(false);
field.setIsIdentity(true);
tabledefinition.addField(field);
addTableDefinition(tabledefinition);
// SECTION: TABLE
tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();
tabledefinition.setName("DDL_CKENTA");
// SECTION: ID FIELDS
field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field.setName("SEQ");
field.setType(Integer.class);
field.setShouldAllowNull(false);
field.setIsPrimaryKey(true);
field.setUnique(false);
field.setIsIdentity(true);
tabledefinition.addField(field);
field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field.setName("F_NAME");
field.setType(String.class);
field.setSize(64);
field.setShouldAllowNull(false);
field.setIsPrimaryKey(true);
field.setUnique(false);
field.setIsIdentity(true);
tabledefinition.addField(field);
field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
field.setName("L_NAME");
field.setType(String.class);
field.setSize(64);
field.setShouldAllowNull(false);
field.setIsPrimaryKey(true);
field.setUnique(false);
field.setIsIdentity(true);
tabledefinition.addField(field);
addTableDefinition(tabledefinition);
}
}
}