================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/tests/FullRegressionTestSuite.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000001/AB0952363AC40CBFE034080020E8C54E.25 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000001/AB0952363AC40CBFE034080020E8C54E.25 Mon Nov 6 14:11:37 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/tests/FullRegressionTestSuite.java Tue Nov 7 10:57:21 2006 *************** *** 63,70 **** import oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLModifyTestSuite; import oracle.toplink.essentials.testing.tests.cmp3.xml.EntityMappingsJUnitTestSuite; import oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLInheritanceTestSuite; - import oracle.toplink.essentials.testing.tests.cmp3.instancecounting.MemoryLeakJUnitTestSuite; public class FullRegressionTestSuite extends TestSuite{ --- 63,70 ---- import oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLModifyTestSuite; import oracle.toplink.essentials.testing.tests.cmp3.xml.EntityMappingsJUnitTestSuite; + import oracle.toplink.essentials.testing.tests.cmp3.ddlgeneration.DDLGenerationJUnitTestSuite; import oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLInheritanceTestSuite; public class FullRegressionTestSuite extends TestSuite{ *************** *** 113,121 **** fullSuite.addTest(QueryParameterValidationTestSuite.suite()); fullSuite.addTest(UniAndBiDirectionalMappingTestSuite.suite()); - // Instance Counting Model - fullSuite.addTest(MemoryLeakJUnitTestSuite.suite()); - // EJBQL testing model fullSuite.addTest(JUnitEJBQLUnitTestSuite.suite()); fullSuite.addTest(JUnitEJBQLSimpleTestSuite.suite()); --- 113,118 ---- *************** *** 131,136 **** --- 128,136 ---- // XML model fullSuite.addTest(EntityMappingsJUnitTestSuite.suite()); + // DDL model + fullSuite.addTest(DDLGenerationJUnitTestSuite.suite()); + return fullSuite; } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/TableDefinition.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000002/AB0952363AC40CBFE034080020E8C54E.9 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000002/AB0952363AC40CBFE034080020E8C54E.9 Mon Nov 6 14:28:26 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/TableDefinition.java Tue Nov 7 10:57:21 2006 *************** *** 27,32 **** --- 27,33 ---- import oracle.toplink.essentials.internal.databaseaccess.*; import oracle.toplink.essentials.exceptions.*; import oracle.toplink.essentials.internal.sessions.AbstractSession; + import oracle.toplink.essentials.queryframework.SQLCall; /** *

*************** *** 34,41 **** *

*/ public class TableDefinition extends DatabaseObjectDefinition { ! protected Vector fields; ! protected Vector foreignKeys; protected Vector uniqueKeys; protected String creationPrefix; protected String creationSuffix; --- 35,42 ---- *

*/ public class TableDefinition extends DatabaseObjectDefinition { ! protected Vector fields; //FieldDefinitions ! protected HashMap foreignKeyMap; //key is the name of ForeignKeyConstraint protected Vector uniqueKeys; protected String creationPrefix; protected String creationSuffix; *************** *** 43,49 **** public TableDefinition() { this.fields = new Vector(); ! this.foreignKeys = new Vector(); this.uniqueKeys = new Vector(); this.creationPrefix = "CREATE TABLE "; this.creationSuffix = ""; --- 44,50 ---- public TableDefinition() { this.fields = new Vector(); ! this.foreignKeyMap = new HashMap(); this.uniqueKeys = new Vector(); this.creationPrefix = "CREATE TABLE "; this.creationSuffix = ""; *************** *** 96,101 **** --- 97,103 ---- /** * PUBLIC: * Add a foreign key constraint to the table. + * If there is a same name foreign key constraint already, nothing will happen. */ public void addForeignKeyConstraint(String name, String sourceField, String targetField, String targetTable) { ForeignKeyConstraint foreignKey = new ForeignKeyConstraint(name, sourceField, targetField, targetTable); *************** *** 114,122 **** /** * PUBLIC: * Add a foreign key constraint to the table. */ public void addForeignKeyConstraint(ForeignKeyConstraint foreignKey) { ! getForeignKeys().addElement(foreignKey); } /** --- 116,127 ---- /** * PUBLIC: * Add a foreign key constraint to the table. + * If there is a same name foreign key constraint already, nothing will happen. */ public void addForeignKeyConstraint(ForeignKeyConstraint foreignKey) { ! if (!foreignKeyMap.containsKey(foreignKey.getName())) { ! foreignKeyMap.put(foreignKey.getName(), foreignKey); ! } } /** *************** *** 371,384 **** private void buildForeignFieldTypes(final AbstractSession session) { Hashtable fieldTypes = session.getPlatform().getClassTypes(); FieldDefinition field = null; - DatabaseField dbField = null; ! Vector foreignKeysClone = (Vector)getForeignKeys().clone(); ! setForeignKeys(new Vector()); for (Enumeration enumtr = getFields().elements(); enumtr.hasMoreElements();) { field = (FieldDefinition)enumtr.nextElement(); if (field.getForeignKeyFieldName() != null) { ! addForeignKeyConstraint(buildForeignKeyConstraint(field, this, session.getPlatform())); } if (field.getType() == null) { --- 376,390 ---- private void buildForeignFieldTypes(final AbstractSession session) { Hashtable fieldTypes = session.getPlatform().getClassTypes(); FieldDefinition field = null; ! // The ForeignKeyConstraint object is the newer way of doing things. ! // We support FieldDefinition.getForeignKeyFieldName() due to backwards compatibility ! // by converting it. To allow mixing both ways, we just add converted one to foreignKeys list. ! for (Enumeration enumtr = getFields().elements(); enumtr.hasMoreElements();) { field = (FieldDefinition)enumtr.nextElement(); if (field.getForeignKeyFieldName() != null) { ! addForeignKeyConstraint(buildForeignKeyConstraint(field, session.getPlatform())); } if (field.getType() == null) { *************** *** 389,403 **** } } - /* bug #2997188 constraints not getting generated when creating/replacing tables via TableCreator - had to add the next few lines instead of removing the above code for backwards compatibility */ - if (getForeignKeys().isEmpty()) { - //if foreignKeys is empty then we know we are not in 2.5 - setForeignKeys(foreignKeysClone); - } } ! protected ForeignKeyConstraint buildForeignKeyConstraint(FieldDefinition field, TableDefinition table, DatabasePlatform platform) { Vector sourceFields = new Vector(); Vector targetFields = new Vector(); ForeignKeyConstraint fkConstraint = new ForeignKeyConstraint(); --- 395,406 ---- } } } ! /** ! * Build a foriegn key constraint using FieldDefinition.getForeignKeyFieldName(). ! */ ! protected ForeignKeyConstraint buildForeignKeyConstraint(FieldDefinition field, DatabasePlatform platform) { Vector sourceFields = new Vector(); Vector targetFields = new Vector(); ForeignKeyConstraint fkConstraint = new ForeignKeyConstraint(); *************** *** 410,422 **** fkConstraint.setSourceFields(sourceFields); fkConstraint.setTargetFields(targetFields); fkConstraint.setTargetTable(tempTargetField.getTable().getQualifiedName()); ! String tempName = buildForeignKeyConstraintName(table.getName(), tempSourceField.getName(), platform.getMaxForeignKeyNameSize()); fkConstraint.setName(tempName); return fkConstraint; } /** * Return foreign key constraint name built from the table and field name with the specified maximum length. To * make the name short enough we * 1. Drop the "FK_" prefix. --- 413,445 ---- fkConstraint.setSourceFields(sourceFields); fkConstraint.setTargetFields(targetFields); fkConstraint.setTargetTable(tempTargetField.getTable().getQualifiedName()); ! String tempName = buildForeignKeyConstraintName(this.getName(), tempSourceField.getName(), platform.getMaxForeignKeyNameSize()); fkConstraint.setName(tempName); return fkConstraint; } /** + * Build a foriegn key constraint. + */ + protected ForeignKeyConstraint buildForeignKeyConstraint(Vector fkFieldNames, Vector pkFieldNames, TableDefinition targetTable, DatabasePlatform platform) { + assert fkFieldNames.size() > 0 && fkFieldNames.size() == pkFieldNames.size(); + + ForeignKeyConstraint fkConstraint = new ForeignKeyConstraint(); + for(int i=0; i getForeignKeyMap() { + return foreignKeyMap; + } + + /** + * INTERNAL: + */ + void setForeignKeyMap(HashMap foreignKeyMap) { + this.foreignKeyMap = foreignKeyMap; + } + + /** + * PUBLIC: + */ public Vector getFields() { return fields; } ! /** ! * PUBLIC: ! * Returns the ForeignKeyConstraint list. ! */ ! public Vector getForeignKeys() { ! return new Vector(foreignKeyMap.values()); } + /** + * PUBLIC: + */ public Vector getUniqueKeys() { return uniqueKeys; } + /** + * PUBLIC: + */ public Vector getPrimaryKeyFieldNames() { Vector keyNames = new Vector(); *************** *** 698,715 **** return keyNames; } public void setFields(Vector fields) { this.fields = fields; } ! public void setForeignKeys(Vector foreignKeys) { ! this.foreignKeys = foreignKeys; } public void setUniqueKeys(Vector uniqueKeys) { this.uniqueKeys = uniqueKeys; } public void setCreateSQLFiles(boolean genFlag) { this.createSQLFiles = genFlag; } --- 746,782 ---- return keyNames; } + /** + * PUBLIC: + */ public void setFields(Vector fields) { this.fields = fields; } ! /** ! * PUBLIC: ! * Set the ForeignKeyConstraint list. ! * If the list contains the same name foreign key constraints, only the first one of that name will be added. ! */ ! public void setForeignKeys(Vector foreignKeys) { ! foreignKeyMap.clear(); ! if (foreignKeys != null) { ! for(ForeignKeyConstraint foreignKey : foreignKeys) { ! foreignKeyMap.put(foreignKey .getName(), foreignKey); ! } ! } } + /** + * PUBLIC: + */ public void setUniqueKeys(Vector uniqueKeys) { this.uniqueKeys = uniqueKeys; } + /** + * PUBLIC: + */ public void setCreateSQLFiles(boolean genFlag) { this.createSQLFiles = genFlag; } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/DefaultTableGenerator.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000003/AB0952363AC40CBFE034080020E8C54E.13 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000003/AB0952363AC40CBFE034080020E8C54E.13 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/DefaultTableGenerator.java Tue Nov 7 10:57:21 2006 *************** *** 24,30 **** import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; - import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Vector; --- 24,29 ---- *************** *** 45,50 **** --- 44,50 ---- import oracle.toplink.essentials.descriptors.ClassDescriptor; import oracle.toplink.essentials.internal.sessions.AbstractSession; + import oracle.toplink.essentials.internal.databaseaccess.DatabasePlatform; import oracle.toplink.essentials.mappings.OneToManyMapping; import oracle.toplink.essentials.mappings.OneToOneMapping; import oracle.toplink.essentials.sessions.Project; *************** *** 93,98 **** --- 93,101 ---- //the project object used to generate the default data schema. Project project = null; + //the target database platform + private DatabasePlatform databasePlatform; + //used to track the table definition: keyed by the table name, and valued //by the table definition object private Map tableMap = null; *************** *** 106,111 **** --- 109,115 ---- */ public DefaultTableGenerator(Project project) { this.project = project; + databasePlatform = project.getLogin().getPlatform(); tableMap = new HashMap(); fieldMap = new HashMap(); } *************** *** 124,130 **** //aggregate RelationalDescriptor does not contains table/field data if (!desc.isAggregateDescriptor()) { ! initTableSchema((ClassDescriptor)desc); } } --- 128,134 ---- //aggregate RelationalDescriptor does not contains table/field data if (!desc.isAggregateDescriptor()) { ! initTableSchema(desc); } } *************** *** 297,332 **** //first create relation table TableDefinition tblDef = getTableDefFromDBTable(mapping.getRelationTable()); - DatabaseField dbField = null; - DatabaseField parentDBField = null; - FieldDefinition fldDef = null; - //add source foreign key fields into the relation table Vector srcFkFields = mapping.getSourceRelationKeyFields(); ! for (int index = 0; index < srcFkFields.size(); index++) { ! parentDBField = (DatabaseField) mapping.getSourceKeyFields().get(index); ! dbField = resolveDatabaseField((DatabaseField) srcFkFields.get(index), parentDBField); ! setFieldToRelationTable(dbField, tblDef); ! setForeignKeyForRelationTable(dbField, parentDBField); ! } //add target foreign key fields into the relation table Vector targFkFields = mapping.getTargetRelationKeyFields(); ! ! for (int index = 0; index < targFkFields.size(); index++) { ! parentDBField = (DatabaseField) mapping.getTargetKeyFields().get(index); ! dbField = resolveDatabaseField((DatabaseField) targFkFields.get(index), parentDBField); ! setFieldToRelationTable(dbField, tblDef); ! setForeignKeyForRelationTable(dbField, parentDBField); ! } } ! private void setForeignKeyForRelationTable(final DatabaseField dbField, final DatabaseField parentDBField) { ! FieldDefinition fldDef; ! fldDef = getFieldDefFromDBField(dbField, false); ! fldDef.setForeignKeyFieldName(parentDBField.getTable().getName() + "." + parentDBField.getName()); ! return; } /** --- 301,345 ---- //first create relation table TableDefinition tblDef = getTableDefFromDBTable(mapping.getRelationTable()); //add source foreign key fields into the relation table Vector srcFkFields = mapping.getSourceRelationKeyFields(); + Vector srcKeyFields = mapping.getSourceKeyFields(); ! buildRelationTableFields(tblDef, srcFkFields, srcKeyFields); //add target foreign key fields into the relation table Vector targFkFields = mapping.getTargetRelationKeyFields(); ! Vector targKeyFields = mapping.getTargetKeyFields(); ! ! buildRelationTableFields(tblDef, targFkFields, targKeyFields); } ! /** ! * Build field definitions and foreign key constraints for all many-to-many relation table. ! */ ! private void buildRelationTableFields(TableDefinition tblDef, Vector fkFields, Vector targetFields) { ! assert fkFields.size() > 0 && fkFields.size() == targetFields.size(); ! ! DatabaseField fkField = null; ! DatabaseField targetField = null; ! Vector fkFieldNames = new Vector(); ! Vector targetFieldNames = new Vector(); ! ! for (int index = 0; index < fkFields.size(); index++) { ! fkField = (DatabaseField) fkFields.get(index); ! targetField = (DatabaseField) targetFields.get(index); ! fkFieldNames.add(fkField.getName()); ! targetFieldNames.add(targetField.getName()); ! ! fkField = resolveDatabaseField(fkField, targetField); ! setFieldToRelationTable(fkField, tblDef); ! } ! ! // add a foreign key constraint ! DatabaseTable targetTable = targetField.getTable(); ! TableDefinition targetTblDef = getTableDefFromDBTable(targetTable); ! ! addForeignKeyConstraint(tblDef, targetTblDef, fkFieldNames, targetFieldNames); } /** *************** *** 390,415 **** } private void addForeignKeyFieldToFieldDefinition(final Map srcFields) { DatabaseField dbSrcField = null; DatabaseField dbTrgField = null; //add source foreign key fields into the table for (Iterator srcFkFields = srcFields.keySet().iterator(); srcFkFields.hasNext();) { dbSrcField = (DatabaseField)srcFkFields.next(); dbTrgField = (DatabaseField)srcFields.get(dbSrcField); FieldDefinition srcFldDef = (FieldDefinition)fieldMap.get(dbSrcField); FieldDefinition trgFldDef = (FieldDefinition)fieldMap.get(dbTrgField); ! srcFldDef.setForeignKeyFieldName( ! dbTrgField.getTable().getQualifiedName() + "." + dbTrgField.getName()); ! ! // Also ensure that the type, size and subsize of the foreign key field is ! // same as that of the original field. ! srcFldDef.setType(trgFldDef.getType()); ! srcFldDef.setSize(trgFldDef.getSize()); ! srcFldDef.setSubSize(trgFldDef.getSubSize()); } } /** --- 403,443 ---- } private void addForeignKeyFieldToFieldDefinition(final Map srcFields) { + if(srcFields.size() == 0) { + return; + } + DatabaseField dbSrcField = null; DatabaseField dbTrgField = null; //add source foreign key fields into the table + Vector fkFieldNames = new Vector(); + Vector targetFieldNames = new Vector(); for (Iterator srcFkFields = srcFields.keySet().iterator(); srcFkFields.hasNext();) { dbSrcField = (DatabaseField)srcFkFields.next(); dbTrgField = (DatabaseField)srcFields.get(dbSrcField); + fkFieldNames.add(dbSrcField.getName()); + targetFieldNames.add(dbTrgField.getName()); FieldDefinition srcFldDef = (FieldDefinition)fieldMap.get(dbSrcField); FieldDefinition trgFldDef = (FieldDefinition)fieldMap.get(dbTrgField); ! if(srcFldDef != null && trgFldDef != null) { ! // Also ensure that the type, size and subsize of the foreign key field is ! // same as that of the original field. ! srcFldDef.setType(trgFldDef.getType()); ! srcFldDef.setSize(trgFldDef.getSize()); ! srcFldDef.setSubSize(trgFldDef.getSubSize()); ! } } + + // add a foreign key constraint + DatabaseTable sourceTable = dbSrcField.getTable(); + DatabaseTable targetTable = dbTrgField.getTable(); + TableDefinition sourceTableDef = getTableDefFromDBTable(sourceTable); + TableDefinition targetTableDef = getTableDefFromDBTable(targetTable); + + addForeignKeyConstraint(sourceTableDef, targetTableDef, fkFieldNames, targetFieldNames); } /** *************** *** 439,444 **** --- 467,475 ---- DatabaseField reslovedDatabaseField = new DatabaseField(); reslovedDatabaseField.setName(childField.getName()); reslovedDatabaseField.setType(getFieldDefFromDBField(parentField, true).getType()); + //Table should be set, otherwise other same name field will be used wrongly because equals() is true. + //Fix for GF#1392 the same name column for the entity and many-to-many table cause wrong pk constraint. + reslovedDatabaseField.setTable(childField.getTable()); return reslovedDatabaseField; } *************** *** 478,484 **** } if ((fieldType == null) || (!fieldType.isPrimitive() && ! (new DatabaseSessionImpl(project).getPlatform().getFieldTypeDefinition(fieldType) == null))) { //TODO: log a warning for inaccessiable type or not convertable type. AbstractSessionLog.getLog().log(SessionLog.FINEST, "field_type_set_to_java_lang_string", dbField.getQualifiedName(), fieldType); --- 509,515 ---- } if ((fieldType == null) || (!fieldType.isPrimitive() && ! (databasePlatform.getFieldTypeDefinition(fieldType) == null))) { //TODO: log a warning for inaccessiable type or not convertable type. AbstractSessionLog.getLog().log(SessionLog.FINEST, "field_type_set_to_java_lang_string", dbField.getQualifiedName(), fieldType); *************** *** 531,553 **** dbTbl = (DatabaseTable) dbTblIter.next(); Map srcFields = (HashMap)desc.getAdditionalTablePrimaryKeyFields().get(dbTbl); if (null != srcFields) { ! addJoinColumnsFkFieldToFieldDefinition(srcFields); } } } ! private void addJoinColumnsFkFieldToFieldDefinition(final Map srcFields) { ! DatabaseField dbSrcField = null; ! DatabaseField dbTrgField = null; //add source foreign key fields into the table ! for (Iterator srcFkFields = srcFields.keySet().iterator(); srcFkFields.hasNext();) { ! dbSrcField = (DatabaseField)srcFkFields.next(); ! dbTrgField = (DatabaseField)srcFields.get(dbSrcField); ! FieldDefinition srcFldDef = (FieldDefinition)fieldMap.get(dbSrcField); ! FieldDefinition trgFldDef = (FieldDefinition)fieldMap.get(dbTrgField); ! trgFldDef.setForeignKeyFieldName( ! dbSrcField.getTable().getQualifiedName() + "." + dbSrcField.getName()); ! } } } --- 562,688 ---- dbTbl = (DatabaseTable) dbTblIter.next(); Map srcFields = (HashMap)desc.getAdditionalTablePrimaryKeyFields().get(dbTbl); if (null != srcFields) { ! addJoinColumnsFkConstraint(srcFields); } } } ! private void addJoinColumnsFkConstraint(final Map srcFields) { ! if(srcFields.size() == 0) { ! return; ! } ! ! DatabaseField fkField = null; ! DatabaseField pkField = null; ! Vector fkFieldNames = new Vector(); ! Vector pkFieldNames = new Vector(); //add source foreign key fields into the table ! for (Iterator srcPkFields = srcFields.keySet().iterator(); srcPkFields.hasNext();) { ! pkField = (DatabaseField)srcPkFields.next(); ! fkField = (DatabaseField)srcFields.get(pkField); ! fkFieldNames.add(fkField.getName()); ! pkFieldNames.add(pkField.getName()); ! } ! ! // add a foreign key constraint ! DatabaseTable sourceTable = fkField.getTable(); ! DatabaseTable targetTable = pkField.getTable(); ! TableDefinition sourceTableDef = getTableDefFromDBTable(sourceTable); ! TableDefinition targetTableDef = getTableDefFromDBTable(targetTable); ! ! addForeignKeyConstraint(sourceTableDef, targetTableDef, fkFieldNames, pkFieldNames); ! } ! ! /** ! * Add a foreign key constraint to the source table. ! */ ! private void addForeignKeyConstraint(TableDefinition sourceTableDef, TableDefinition targetTableDef, ! Vector fkFields, Vector targetFields) { ! assert fkFields.size() > 0 && fkFields.size() == targetFields.size(); ! ! // target keys could be primary keys or candidate(unique) keys of the target table ! ! Vector fkFieldNames = fkFields; ! Vector targetFieldNames = targetFields; ! ! if (fkFields.size() > 1) { ! // if composite key, we should consider the order of keys. ! // Foreign Key constraint should follow the primary/unique key order of the target table. ! // e.g. if the primary key constraint of the target table is (p2, p1), ! // foreign key constraint should be "(f2, f1) REFERENCES TARGET (p2, p1)". ! ! // we try to reorder keys using primary keys or unique keys order of the target table, ! // but if we might not resolve it due to incorrect field name, then let it as it is. ! // This will trigger underlying database exception so users can recognize errors. ! ! boolean resolved = false; ! boolean error = false; ! ! Map targetToFkField = new HashMap(); ! for (int index = 0; index < fkFields.size(); index++) { ! String targetField = targetFields.get(index); ! if (targetToFkField.containsKey(targetField)) { ! //target key column appears more than once ! error = true; ! break; ! } ! targetToFkField.put(targetField, fkFields.get(index)); ! } ! ! Vector orderedFkFields = new Vector(fkFields.size()); ! Vector orderedTargetFields = new Vector(targetFields.size()); ! ! if (!error) { ! // if target fields are primary keys ! resolved = true; ! for (String pkField : (Vector)targetTableDef.getPrimaryKeyFieldNames()) { ! String fkField = targetToFkField.get(pkField); ! if (fkField == null) { ! //primary key column not found ! resolved = false; ! break; ! } ! orderedFkFields.add(fkField); ! orderedTargetFields.add(pkField); ! } ! } ! ! if (!error && !resolved) { ! // if target fields are unique keys ! for (Object uniqueConstraint : targetTableDef.getUniqueKeys()) { ! orderedFkFields.setSize(0); ! orderedTargetFields.setSize(0); ! ! resolved = true; ! for (String ukField : (String[])uniqueConstraint) { ! String fkField = targetToFkField.get(ukField); ! if (fkField == null) { ! //unique key column not found ! resolved = false; ! break; ! } ! orderedFkFields.add(fkField); ! orderedTargetFields.add(ukField); ! } ! if (resolved) { ! break; ! } ! } ! } ! ! if (resolved) { ! fkFieldNames = orderedFkFields; ! targetFieldNames = orderedTargetFields; ! } ! } ! ! // For bidirectional relationships both side of mapping will make the same FK constraint twice. ! // TableDefinition.addForeignKeyConstraint() will ignore the same FK constraint. ! ! ForeignKeyConstraint fkc = sourceTableDef.buildForeignKeyConstraint(fkFieldNames, targetFieldNames, ! targetTableDef, databasePlatform); ! sourceTableDef.addForeignKeyConstraint(fkc); } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/FieldDefinition.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000004/AB0952363AC40CBFE034080020E8C54E.7 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000004/AB0952363AC40CBFE034080020E8C54E.7 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/FieldDefinition.java Tue Nov 7 10:57:21 2006 *************** *** 18,24 **** * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2005, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.*; --- 18,24 ---- * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.*; *************** *** 50,56 **** protected boolean isUnique; protected String additional; protected String constraint; ! protected String foreignKeyFieldName; public FieldDefinition() { this.name = ""; --- 50,57 ---- protected boolean isUnique; protected String additional; protected String constraint; ! // @deprecated Use ForeignKeyConstraint instead. ! protected String foreignKeyFieldName; //fully-qualified foreign key field name public FieldDefinition() { this.name = ""; *************** *** 205,210 **** --- 206,216 ---- return constraint; } + /** + * PUBLIC: + * Return fully-qualified foreign key field name. + * @deprecated Use ForeignKeyConstraint instead. + */ public String getForeignKeyFieldName() { return foreignKeyFieldName; } *************** *** 296,301 **** --- 302,314 ---- constraint = string; } + /** + * PUBLIC: + * Set the foreign key field name. This value is used for a foreign key constraint. + * + * @param foreignKeyFieldName fully-qualified field name + * @deprecated Use ForeignKeyConstraint instead. + */ public void setForeignKeyFieldName(String foreignKeyFieldName) { this.foreignKeyFieldName = foreignKeyFieldName; } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/ForeignKeyConstraint.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000005/AB0952363AC40CBFE034080020E8C54E.5 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000005/AB0952363AC40CBFE034080020E8C54E.5 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/ForeignKeyConstraint.java Tue Nov 7 10:57:21 2006 *************** *** 18,24 **** * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2005, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.*; --- 18,24 ---- * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.*; *************** *** 33,41 **** */ public class ForeignKeyConstraint implements Serializable { protected String name; ! protected Vector sourceFields; ! protected Vector targetFields; ! protected String targetTable; protected boolean shouldCascadeOnDelete; public ForeignKeyConstraint() { --- 33,41 ---- */ public class ForeignKeyConstraint implements Serializable { protected String name; ! protected Vector sourceFields; //source(foreign key) field names ! protected Vector targetFields; //target(primary key) field names ! protected String targetTable; //fully-qualified target table name protected boolean shouldCascadeOnDelete; public ForeignKeyConstraint() { ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/SchemaManager.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000006/AB0952363AC40CBFE034080020E8C54E.14 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000006/AB0952363AC40CBFE034080020E8C54E.14 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/SchemaManager.java Tue Nov 7 10:57:21 2006 *************** *** 19,25 **** * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.Writer; --- 19,25 ---- * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.Writer; *************** *** 55,61 **** protected DatabaseSessionImpl session; protected Writer createSchemaWriter; protected Writer dropSchemaWriter; ! protected boolean createSQLFiles = true; public SchemaManager(DatabaseSessionImpl session) { this.session = session; --- 55,61 ---- protected DatabaseSessionImpl session; protected Writer createSchemaWriter; protected Writer dropSchemaWriter; ! protected boolean createSQLFiles = true; //if true, schema writer will add terminator string. public SchemaManager(DatabaseSessionImpl session) { this.session = session; *************** *** 112,120 **** */ public void closeDDLWriter() { closeDDLWriter(createSchemaWriter); ! if (null != dropSchemaWriter) { ! closeDDLWriter(dropSchemaWriter); ! } } public void closeDDLWriter(Writer schemaWriter) { --- 112,120 ---- */ public void closeDDLWriter() { closeDDLWriter(createSchemaWriter); ! closeDDLWriter(dropSchemaWriter); ! createSchemaWriter = null; ! dropSchemaWriter = null; } public void closeDDLWriter(Writer schemaWriter) { *************** *** 125,131 **** try { schemaWriter.flush(); schemaWriter.close(); - schemaWriter = null; } catch (java.io.IOException ioException) { throw ValidationException.fileError(ioException); } --- 125,130 ---- *************** *** 143,148 **** --- 142,165 ---- tableDefinition.createConstraints(getSession(), createSchemaWriter); } } + + void createUniqueConstraints(TableDefinition tableDefinition) throws TopLinkException { + if (shouldWriteToDatabase()) { + tableDefinition.createUniqueConstraintsOnDatabase(getSession()); + } else { + tableDefinition.setCreateSQLFiles(createSQLFiles); + tableDefinition.createUniqueConstraints(getSession(), createSchemaWriter); + } + } + + void createForeignConstraints(TableDefinition tableDefinition) throws TopLinkException { + if (shouldWriteToDatabase()) { + tableDefinition.createForeignConstraintsOnDatabase(getSession()); + } else { + tableDefinition.setCreateSQLFiles(createSQLFiles); + tableDefinition.createForeignConstraints(getSession(), createSchemaWriter); + } + } /** * Use the definition object to create the schema entity on the database. ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/TableCreator.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000007/AB0952363AC40CBFE034080020E8C54E.5 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000007/AB0952363AC40CBFE034080020E8C54E.5 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/TableCreator.java Tue Nov 7 10:57:21 2006 *************** *** 18,24 **** * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2005, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.util.*; --- 18,24 ---- * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.util.*; *************** *** 75,82 **** schemaManager.buildFieldTypes((TableDefinition)enumtr.nextElement()); } for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createConstraints((TableDefinition)enumtr.nextElement()); } } --- 75,88 ---- schemaManager.buildFieldTypes((TableDefinition)enumtr.nextElement()); } + // Unique constraints should be generated before foreign key constraints, + // because foreign key constraints can reference unique constraints for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createUniqueConstraints((TableDefinition)enumtr.nextElement()); ! } ! ! for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createForeignConstraints((TableDefinition)enumtr.nextElement()); } } *************** *** 107,114 **** } } for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createConstraints((TableDefinition)enumtr.nextElement()); } schemaManager.createSequences(); --- 113,126 ---- } } + // Unique constraints should be generated before foreign key constraints, + // because foreign key constraints can reference unique constraints for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createUniqueConstraints((TableDefinition)enumtr.nextElement()); ! } ! ! for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createForeignConstraints((TableDefinition)enumtr.nextElement()); } schemaManager.createSequences(); *************** *** 252,259 **** } } for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createConstraints((TableDefinition)enumtr.nextElement()); } } --- 264,277 ---- } } + // Unique constraints should be generated before foreign key constraints, + // because foreign key constraints can reference unique constraints + for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { + schemaManager.createUniqueConstraints((TableDefinition)enumtr.nextElement()); + } + for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createForeignConstraints((TableDefinition)enumtr.nextElement()); } } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/tests/cmp3/ddlgeneration/DDLGenerationJUnitTestSuite.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000010/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000010/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:25 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/tests/cmp3/ddlgeneration/DDLGenerationJUnitTestSuite.java Tue Nov 7 10:55:25 2006 *************** *** 0 **** --- 1,150 ---- + package oracle.toplink.essentials.testing.tests.cmp3.ddlgeneration; + + import junit.extensions.TestSetup; + import junit.framework.Test; + import junit.framework.TestSuite; + import oracle.toplink.essentials.testing.framework.junit.JUnitTestCase; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityA; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityAPK; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityB; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityBPK; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityC; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityCPK; + + import javax.persistence.EntityManager; + import java.util.HashMap; + import java.util.Map; + + /** + * JUnit test case(s) for DDL generation. + */ + public class DDLGenerationJUnitTestSuite extends JUnitTestCase { + + public DDLGenerationJUnitTestSuite() { + super(); + } + + public DDLGenerationJUnitTestSuite(String name) { + super(name); + } + + public static Test suite() { + TestSuite suite = new TestSuite(DDLGenerationJUnitTestSuite.class); + + return new TestSetup(suite) { + + protected void setUp() { + // Trigger DDL generation + //TODO: Let's add a flag which do not disregard DDL generation errors. + //TODO: This is required to ensure that DDL generation has succeeded. + EntityManager em = createEntityManager("ddlGeneration"); + em.close(); + } + + protected void tearDown() { + clearCache("ddlGeneration"); + } + }; + } + + // Test for GF#1392 + // If there is a same name column for the entity and many-to-many table, wrong pk constraint generated. + public void testDDLPkConstraintErrorIncludingRelationTableColumnName() { + EntityManager em = createEntityManager("ddlGeneration"); + em.getTransaction().begin(); + try { + + CKeyEntityC c = new CKeyEntityC(new CKeyEntityCPK("Manager")); + em.persist(c); + + em.getTransaction().commit(); + } catch (RuntimeException e) { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + fail("DDL generation may generate wrong Primary Key constraint, thrown:" + e); + } finally { + em.close(); + } + } + + // Test for relationships using candidate(unique) keys + public void testDDLUniqueKeysAsJoinColumns() { + CKeyEntityAPK aKey; + CKeyEntityBPK bKey; + + EntityManager em = createEntityManager("ddlGeneration"); + em.getTransaction().begin(); + try { + CKeyEntityA a = new CKeyEntityA("Wonseok", "Kim"); + CKeyEntityB b = new CKeyEntityB("B1209"); + //set unique keys + b.setUnq1("u0001"); + b.setUnq2("u0002"); + + a.setUniqueB(b); + b.setUniqueA(a); + + em.persist(a); + em.persist(b); + + em.getTransaction().commit(); + + aKey = a.getKey(); + bKey = b.getKey(); + } catch (RuntimeException e) { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + throw e; + } finally { + em.close(); + } + //clearCache("ddlGeneration"); + + em = createEntityManager("ddlGeneration"); + em.getTransaction().begin(); + try { + CKeyEntityA a = em.find(CKeyEntityA.class, aKey); + assertNotNull(a); + + CKeyEntityB b = a.getUniqueB(); + assertNotNull(b); + + assertEquals(b.getUnq1(), "u0001"); + assertEquals(b.getUnq2(), "u0002"); + + em.getTransaction().commit(); + } catch (RuntimeException e) { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + throw e; + } finally { + em.close(); + } + //clearCache("ddlGeneration"); + + em = createEntityManager("ddlGeneration"); + em.getTransaction().begin(); + try { + + CKeyEntityB b = em.find(CKeyEntityB.class, bKey); + assertNotNull(b); + + CKeyEntityA a = b.getUniqueA(); + assertNotNull(a); + assertEquals(a.getKey(), aKey); + + em.getTransaction().commit(); + } catch (RuntimeException e) { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + throw e; + } finally { + em.close(); + } + + } + + public static void main(String[] args) { + junit.textui.TestRunner.run(suite()); + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityA.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000013/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000013/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:29 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityA.java Tue Nov 7 10:55:28 2006 *************** *** 0 **** --- 1,114 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Column; + import javax.persistence.Entity; + import javax.persistence.GeneratedValue; + import static javax.persistence.GenerationType.TABLE; + import javax.persistence.Id; + import javax.persistence.IdClass; + import javax.persistence.JoinColumn; + import javax.persistence.JoinColumns; + import javax.persistence.ManyToOne; + import javax.persistence.OneToOne; + import javax.persistence.Table; + import javax.persistence.TableGenerator; + import java.util.Collection; + + /** + * Composite key Entity. + * + * @author Wonseok Kim + */ + @Entity + @IdClass(CKeyEntityAPK.class) + @Table(name = "DDL_CKENTA") + @TableGenerator( + name = "CKEYENTITY_TABLE_GENERATOR", + table = "DDL_CKENT_SEQ", + pkColumnName = "SEQ_NAME", + valueColumnName = "SEQ_COUNT", + pkColumnValue = "CKENT_SEQ" + ) + public class CKeyEntityA { + @Id + @GeneratedValue(strategy = TABLE, generator = "CKEYENTITY_TABLE_GENERATOR") + @Column(name = "SEQ") + private int seq; + + @Id + @Column(name = "F_NAME") + private String firstName; + + @Id + @Column(name = "L_NAME") + private String lastName; + + @ManyToOne + @JoinColumns({ + @JoinColumn(name="B_SEQ", referencedColumnName = "SEQ"), + @JoinColumn(name="B_CODE", referencedColumnName = "CODE") + }) + private Collection bs; + + @OneToOne(mappedBy="a") + private CKeyEntityC c; + + // Relationship using candidate(unique) keys + // For testing whether a generated FK constraint has reordered unique keys according to target table. + // CKeyEntityB has unique constraint ("UNQ2", "UNQ1"). + @OneToOne + @JoinColumns({ + @JoinColumn(name="B_UNQ1", referencedColumnName = "UNQ1"), + @JoinColumn(name="B_UNQ2", referencedColumnName = "UNQ2") + }) + private CKeyEntityB uniqueB; + + + public CKeyEntityA() { + } + + public CKeyEntityA(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public int getSeq() { + return seq; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public CKeyEntityAPK getKey() { + return new CKeyEntityAPK(seq, firstName, lastName); + } + + public Collection getBs() { + return bs; + } + + public void setBs(Collection bs) { + this.bs = bs; + } + + public CKeyEntityC getC() { + return c; + } + + public void setC(CKeyEntityC c) { + this.c = c; + } + + public CKeyEntityB getUniqueB() { + return uniqueB; + } + + public void setUniqueB(CKeyEntityB uniqueB) { + this.uniqueB = uniqueB; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityAPK.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000014/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000014/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:32 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityAPK.java Tue Nov 7 10:55:32 2006 *************** *** 0 **** --- 1,37 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + /** + * @author Wonseok Kim + */ + public class CKeyEntityAPK { + public int seq; + public String firstName; + public String lastName; + + + public CKeyEntityAPK() { + } + + public CKeyEntityAPK(int seq, String firstName, String lastName) { + this.seq = seq; + this.firstName = firstName; + this.lastName = lastName; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CKeyEntityAPK that = (CKeyEntityAPK) o; + + return seq == that.seq && firstName.equals(that.firstName) && lastName.equals(that.lastName); + } + + public int hashCode() { + int result; + result = seq; + result = 31 * result + firstName.hashCode(); + result = 31 * result + lastName.hashCode(); + return result; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityB.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000015/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000015/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:36 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityB.java Tue Nov 7 10:55:35 2006 *************** *** 0 **** --- 1,114 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Column; + import javax.persistence.Entity; + import javax.persistence.GeneratedValue; + import static javax.persistence.GenerationType.TABLE; + import javax.persistence.Id; + import javax.persistence.IdClass; + import javax.persistence.Inheritance; + import javax.persistence.InheritanceType; + import javax.persistence.ManyToMany; + import javax.persistence.OneToMany; + import javax.persistence.OneToOne; + import javax.persistence.Table; + import javax.persistence.UniqueConstraint; + import java.util.Collection; + + /** + * Composite Key Entity. + * + * @author Wonseok Kim + */ + @Entity + @IdClass(CKeyEntityBPK.class) + @Inheritance(strategy = InheritanceType.JOINED) + @Table(name = "DDL_CKENTB", + uniqueConstraints = { + @UniqueConstraint(columnNames={"UNQ2, UNQ1"}) //The order of columns shoud not be changed. See CKeyEntityA. + }) + public class CKeyEntityB { + @Id + @GeneratedValue(strategy = TABLE, generator = "CKEYENTITY_TABLE_GENERATOR") + @Column(name = "SEQ") + private int seq; + + @Id + @Column(name = "CODE") + private String code; + + @Column(name = "UNQ1", nullable = false) + private String unq1; + + @Column(name = "UNQ2", nullable = false) + private String unq2; + + + @OneToMany(mappedBy="bs") + private Collection as; + + @ManyToMany(mappedBy="bs") + private Collection cs; + + @OneToOne(mappedBy="uniqueB") + private CKeyEntityA uniqueA; + + public CKeyEntityB() { + } + + public CKeyEntityB(String code) { + this.code = code; + } + + public int getSeq() { + return seq; + } + + public String getCode() { + return code; + } + + public CKeyEntityBPK getKey() { + return new CKeyEntityBPK(seq, code); + } + + public String getUnq1() { + return unq1; + } + + public void setUnq1(String unq1) { + this.unq1 = unq1; + } + + public String getUnq2() { + return unq2; + } + + public void setUnq2(String unq2) { + this.unq2 = unq2; + } + + public Collection getAs() { + return as; + } + + public void setAs(Collection as) { + this.as = as; + } + + public Collection getCs() { + return cs; + } + + public void setCs(Collection cs) { + this.cs = cs; + } + + public CKeyEntityA getUniqueA() { + return uniqueA; + } + + public void setUniqueA(CKeyEntityA uniqueA) { + this.uniqueA = uniqueA; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityB2.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000016/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000016/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:40 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityB2.java Tue Nov 7 10:55:39 2006 *************** *** 0 **** --- 1,19 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Entity; + import javax.persistence.PrimaryKeyJoinColumn; + import javax.persistence.PrimaryKeyJoinColumns; + import javax.persistence.Table; + + /** + * @author Wonseok Kim + */ + @Entity + @Table(name="DDL_CKEYENTB2") + @PrimaryKeyJoinColumns({ + @PrimaryKeyJoinColumn(name="SEQ", referencedColumnName="SEQ"), + @PrimaryKeyJoinColumn(name="CODE", referencedColumnName="CODE") + }) + public class CKeyEntityB2 extends CKeyEntityB { + + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityBPK.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000017/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000017/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:44 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityBPK.java Tue Nov 7 10:55:43 2006 *************** *** 0 **** --- 1,33 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + /** + * @author Wonseok Kim + */ + public class CKeyEntityBPK { + public int seq; + public String code; + + public CKeyEntityBPK() { + } + + public CKeyEntityBPK(int seq, String code) { + this.seq = seq; + this.code = code; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CKeyEntityBPK that = (CKeyEntityBPK) o; + + return seq == that.seq && code.equals(that.code); + } + + public int hashCode() { + int result; + result = seq; + result = 31 * result + (code != null ? code.hashCode() : 0); + return result; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityC.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000018/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000018/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:48 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityC.java Tue Nov 7 10:55:47 2006 *************** *** 0 **** --- 1,87 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Column; + import javax.persistence.EmbeddedId; + import javax.persistence.Entity; + import javax.persistence.JoinColumn; + import javax.persistence.JoinColumns; + import javax.persistence.JoinTable; + import javax.persistence.ManyToMany; + import javax.persistence.OneToOne; + import javax.persistence.Table; + import java.util.Collection; + + /** + * Composite Key Entity. + * + * @author Wonseok Kim + */ + @Entity + @Table(name = "DDL_CKENTC") + public class CKeyEntityC { + + @EmbeddedId + private CKeyEntityCPK key; + + // Test for GF#1392 + // If there is a same name column for the entity and many-to-many table, wrong pk constraint generated. + @Column(name="C_ROLE") + private String tempRole; + + @OneToOne + @JoinColumns({ + @JoinColumn(name="A_SEQ", referencedColumnName = "SEQ"), + @JoinColumn(name="A_L_NAME", referencedColumnName = "L_NAME"), + @JoinColumn(name="A_F_NAME", referencedColumnName = "F_NAME") + }) + private CKeyEntityA a; + + @ManyToMany + @JoinTable(name="DDL_CKENT_C_B", + joinColumns={ + @JoinColumn(name="C_SEQ", referencedColumnName="SEQ"), + @JoinColumn(name="C_ROLE", referencedColumnName="ROLE") + }, + inverseJoinColumns={ + @JoinColumn(name="B_SEQ", referencedColumnName = "SEQ"), + @JoinColumn(name="B_CODE", referencedColumnName = "CODE") + } + ) + private Collection bs; + + + public CKeyEntityC() { + } + + public CKeyEntityC(CKeyEntityCPK key) { + this.key = key; + } + + public CKeyEntityCPK getKey() { + return key; + } + + public String getTempRole() { + return tempRole; + } + + public void setTempRole(String tempRole) { + this.tempRole = tempRole; + } + + public CKeyEntityA getA() { + return a; + } + + public void setA(CKeyEntityA a) { + this.a = a; + } + + public Collection getBs() { + return bs; + } + + public void setBs(Collection bs) { + this.bs = bs; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityCPK.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000019/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000019/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:52 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityCPK.java Tue Nov 7 10:55:51 2006 *************** *** 0 **** --- 1,43 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Column; + import javax.persistence.Embeddable; + import javax.persistence.GeneratedValue; + import static javax.persistence.GenerationType.TABLE; + + /** + * @author Wonseok Kim + */ + @Embeddable + public class CKeyEntityCPK { + @GeneratedValue(strategy = TABLE, generator = "CKEYENTITY_TABLE_GENERATOR") + @Column(name = "SEQ") + public int seq; + + @Column(name = "ROLE") + public String role; + + + public CKeyEntityCPK() { + } + + public CKeyEntityCPK(String role) { + this.role = role; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CKeyEntityCPK that = (CKeyEntityCPK) o; + + return seq == that.seq && role.equals(that.role); + } + + public int hashCode() { + int result; + result = seq; + result = 31 * result + role.hashCode(); + return result; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/resource/essentials/ddl-generation-testmodel/META-INF/persistence.xml vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000020/AB0952363AC40CBFE034080020E8C54E.3 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000020/AB0952363AC40CBFE034080020E8C54E.3 Tue Nov 7 09:11:29 2006 --- /ade/tware_toplink10i/tltest/resource/essentials/ddl-generation-testmodel/META-INF/persistence.xml Tue Nov 7 10:57:21 2006 *************** *** 11,16 **** --- 11,17 ---- META-INF/merge-inherited-beers.xml META-INF/merge-inherited-consumer.xml META-INF/merge-inherited-certification.xml + META-INF/ddl-generation-model.xml oracle.toplink.essentials.testing.models.cmp3.xml.merge.inherited.EmbeddedSerialNumber *************** *** 24,40 **** - - - - - - --- 25,37 ---- + + ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/resource/essentials/ddl-generation-testmodel/META-INF/ddl-generation-model.xml vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000022/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000022/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:56:01 2006 --- /ade/tware_toplink10i/tltest/resource/essentials/ddl-generation-testmodel/META-INF/ddl-generation-model.xml Tue Nov 7 10:56:00 2006 *************** *** 0 **** --- 1,10 ---- + + + oracle.toplink.essentials.testing.models.cmp3.ddlgeneration + + + + + + + ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/build.xml vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000023/AB0952363AC40CBFE034080020E8C54E.42 Report generated at Tue Nov 7 10:57:21 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000023/AB0952363AC40CBFE034080020E8C54E.42 Tue Nov 7 09:39:40 2006 --- /ade/tware_toplink10i/tltest/build.xml Tue Nov 7 10:57:21 2006 *************** *** 387,393 **** dir="${compile.essentials.destdir}" includes="oracle/toplink/essentials/testing/models/cmp3/**" excludes="oracle/toplink/essentials/testing/models/cmp3/validationfailed/**, ! oracle/toplink/essentials/testing/models/cmp3/xml/**" /> --- 205,212 ---- ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/tests/FullRegressionTestSuite.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000001/AB0952363AC40CBFE034080020E8C54E.25 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000001/AB0952363AC40CBFE034080020E8C54E.25 Mon Nov 6 14:11:37 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/tests/FullRegressionTestSuite.java Tue Nov 7 10:57:21 2006 *************** *** 63,70 **** import oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLModifyTestSuite; import oracle.toplink.essentials.testing.tests.cmp3.xml.EntityMappingsJUnitTestSuite; import oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLInheritanceTestSuite; - import oracle.toplink.essentials.testing.tests.cmp3.instancecounting.MemoryLeakJUnitTestSuite; public class FullRegressionTestSuite extends TestSuite{ --- 63,70 ---- import oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLModifyTestSuite; import oracle.toplink.essentials.testing.tests.cmp3.xml.EntityMappingsJUnitTestSuite; + import oracle.toplink.essentials.testing.tests.cmp3.ddlgeneration.DDLGenerationJUnitTestSuite; import oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLInheritanceTestSuite; public class FullRegressionTestSuite extends TestSuite{ *************** *** 113,121 **** fullSuite.addTest(QueryParameterValidationTestSuite.suite()); fullSuite.addTest(UniAndBiDirectionalMappingTestSuite.suite()); - // Instance Counting Model - fullSuite.addTest(MemoryLeakJUnitTestSuite.suite()); - // EJBQL testing model fullSuite.addTest(JUnitEJBQLUnitTestSuite.suite()); fullSuite.addTest(JUnitEJBQLSimpleTestSuite.suite()); --- 113,118 ---- *************** *** 131,136 **** --- 128,136 ---- // XML model fullSuite.addTest(EntityMappingsJUnitTestSuite.suite()); + // DDL model + fullSuite.addTest(DDLGenerationJUnitTestSuite.suite()); + return fullSuite; } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/TableDefinition.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000002/AB0952363AC40CBFE034080020E8C54E.9 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000002/AB0952363AC40CBFE034080020E8C54E.9 Mon Nov 6 14:28:26 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/TableDefinition.java Tue Nov 7 10:57:21 2006 *************** *** 27,32 **** --- 27,33 ---- import oracle.toplink.essentials.internal.databaseaccess.*; import oracle.toplink.essentials.exceptions.*; import oracle.toplink.essentials.internal.sessions.AbstractSession; + import oracle.toplink.essentials.queryframework.SQLCall; /** *

*************** *** 34,41 **** *

*/ public class TableDefinition extends DatabaseObjectDefinition { ! protected Vector fields; ! protected Vector foreignKeys; protected Vector uniqueKeys; protected String creationPrefix; protected String creationSuffix; --- 35,42 ---- *

*/ public class TableDefinition extends DatabaseObjectDefinition { ! protected Vector fields; //FieldDefinitions ! protected HashMap foreignKeyMap; //key is the name of ForeignKeyConstraint protected Vector uniqueKeys; protected String creationPrefix; protected String creationSuffix; *************** *** 43,49 **** public TableDefinition() { this.fields = new Vector(); ! this.foreignKeys = new Vector(); this.uniqueKeys = new Vector(); this.creationPrefix = "CREATE TABLE "; this.creationSuffix = ""; --- 44,50 ---- public TableDefinition() { this.fields = new Vector(); ! this.foreignKeyMap = new HashMap(); this.uniqueKeys = new Vector(); this.creationPrefix = "CREATE TABLE "; this.creationSuffix = ""; *************** *** 96,101 **** --- 97,103 ---- /** * PUBLIC: * Add a foreign key constraint to the table. + * If there is a same name foreign key constraint already, nothing will happen. */ public void addForeignKeyConstraint(String name, String sourceField, String targetField, String targetTable) { ForeignKeyConstraint foreignKey = new ForeignKeyConstraint(name, sourceField, targetField, targetTable); *************** *** 114,122 **** /** * PUBLIC: * Add a foreign key constraint to the table. */ public void addForeignKeyConstraint(ForeignKeyConstraint foreignKey) { ! getForeignKeys().addElement(foreignKey); } /** --- 116,127 ---- /** * PUBLIC: * Add a foreign key constraint to the table. + * If there is a same name foreign key constraint already, nothing will happen. */ public void addForeignKeyConstraint(ForeignKeyConstraint foreignKey) { ! if (!foreignKeyMap.containsKey(foreignKey.getName())) { ! foreignKeyMap.put(foreignKey.getName(), foreignKey); ! } } /** *************** *** 371,384 **** private void buildForeignFieldTypes(final AbstractSession session) { Hashtable fieldTypes = session.getPlatform().getClassTypes(); FieldDefinition field = null; - DatabaseField dbField = null; ! Vector foreignKeysClone = (Vector)getForeignKeys().clone(); ! setForeignKeys(new Vector()); for (Enumeration enumtr = getFields().elements(); enumtr.hasMoreElements();) { field = (FieldDefinition)enumtr.nextElement(); if (field.getForeignKeyFieldName() != null) { ! addForeignKeyConstraint(buildForeignKeyConstraint(field, this, session.getPlatform())); } if (field.getType() == null) { --- 376,390 ---- private void buildForeignFieldTypes(final AbstractSession session) { Hashtable fieldTypes = session.getPlatform().getClassTypes(); FieldDefinition field = null; ! // The ForeignKeyConstraint object is the newer way of doing things. ! // We support FieldDefinition.getForeignKeyFieldName() due to backwards compatibility ! // by converting it. To allow mixing both ways, we just add converted one to foreignKeys list. ! for (Enumeration enumtr = getFields().elements(); enumtr.hasMoreElements();) { field = (FieldDefinition)enumtr.nextElement(); if (field.getForeignKeyFieldName() != null) { ! addForeignKeyConstraint(buildForeignKeyConstraint(field, session.getPlatform())); } if (field.getType() == null) { *************** *** 389,403 **** } } - /* bug #2997188 constraints not getting generated when creating/replacing tables via TableCreator - had to add the next few lines instead of removing the above code for backwards compatibility */ - if (getForeignKeys().isEmpty()) { - //if foreignKeys is empty then we know we are not in 2.5 - setForeignKeys(foreignKeysClone); - } } ! protected ForeignKeyConstraint buildForeignKeyConstraint(FieldDefinition field, TableDefinition table, DatabasePlatform platform) { Vector sourceFields = new Vector(); Vector targetFields = new Vector(); ForeignKeyConstraint fkConstraint = new ForeignKeyConstraint(); --- 395,406 ---- } } } ! /** ! * Build a foriegn key constraint using FieldDefinition.getForeignKeyFieldName(). ! */ ! protected ForeignKeyConstraint buildForeignKeyConstraint(FieldDefinition field, DatabasePlatform platform) { Vector sourceFields = new Vector(); Vector targetFields = new Vector(); ForeignKeyConstraint fkConstraint = new ForeignKeyConstraint(); *************** *** 410,422 **** fkConstraint.setSourceFields(sourceFields); fkConstraint.setTargetFields(targetFields); fkConstraint.setTargetTable(tempTargetField.getTable().getQualifiedName()); ! String tempName = buildForeignKeyConstraintName(table.getName(), tempSourceField.getName(), platform.getMaxForeignKeyNameSize()); fkConstraint.setName(tempName); return fkConstraint; } /** * Return foreign key constraint name built from the table and field name with the specified maximum length. To * make the name short enough we * 1. Drop the "FK_" prefix. --- 413,445 ---- fkConstraint.setSourceFields(sourceFields); fkConstraint.setTargetFields(targetFields); fkConstraint.setTargetTable(tempTargetField.getTable().getQualifiedName()); ! String tempName = buildForeignKeyConstraintName(this.getName(), tempSourceField.getName(), platform.getMaxForeignKeyNameSize()); fkConstraint.setName(tempName); return fkConstraint; } /** + * Build a foriegn key constraint. + */ + protected ForeignKeyConstraint buildForeignKeyConstraint(Vector fkFieldNames, Vector pkFieldNames, TableDefinition targetTable, DatabasePlatform platform) { + assert fkFieldNames.size() > 0 && fkFieldNames.size() == pkFieldNames.size(); + + ForeignKeyConstraint fkConstraint = new ForeignKeyConstraint(); + for(int i=0; i getForeignKeyMap() { + return foreignKeyMap; + } + + /** + * INTERNAL: + */ + void setForeignKeyMap(HashMap foreignKeyMap) { + this.foreignKeyMap = foreignKeyMap; + } + + /** + * PUBLIC: + */ public Vector getFields() { return fields; } ! /** ! * PUBLIC: ! * Returns the ForeignKeyConstraint list. ! */ ! public Vector getForeignKeys() { ! return new Vector(foreignKeyMap.values()); } + /** + * PUBLIC: + */ public Vector getUniqueKeys() { return uniqueKeys; } + /** + * PUBLIC: + */ public Vector getPrimaryKeyFieldNames() { Vector keyNames = new Vector(); *************** *** 698,715 **** return keyNames; } public void setFields(Vector fields) { this.fields = fields; } ! public void setForeignKeys(Vector foreignKeys) { ! this.foreignKeys = foreignKeys; } public void setUniqueKeys(Vector uniqueKeys) { this.uniqueKeys = uniqueKeys; } public void setCreateSQLFiles(boolean genFlag) { this.createSQLFiles = genFlag; } --- 746,782 ---- return keyNames; } + /** + * PUBLIC: + */ public void setFields(Vector fields) { this.fields = fields; } ! /** ! * PUBLIC: ! * Set the ForeignKeyConstraint list. ! * If the list contains the same name foreign key constraints, only the first one of that name will be added. ! */ ! public void setForeignKeys(Vector foreignKeys) { ! foreignKeyMap.clear(); ! if (foreignKeys != null) { ! for(ForeignKeyConstraint foreignKey : foreignKeys) { ! foreignKeyMap.put(foreignKey .getName(), foreignKey); ! } ! } } + /** + * PUBLIC: + */ public void setUniqueKeys(Vector uniqueKeys) { this.uniqueKeys = uniqueKeys; } + /** + * PUBLIC: + */ public void setCreateSQLFiles(boolean genFlag) { this.createSQLFiles = genFlag; } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/DefaultTableGenerator.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000003/AB0952363AC40CBFE034080020E8C54E.13 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000003/AB0952363AC40CBFE034080020E8C54E.13 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/DefaultTableGenerator.java Tue Nov 7 10:57:21 2006 *************** *** 24,30 **** import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; - import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Vector; --- 24,29 ---- *************** *** 45,50 **** --- 44,50 ---- import oracle.toplink.essentials.descriptors.ClassDescriptor; import oracle.toplink.essentials.internal.sessions.AbstractSession; + import oracle.toplink.essentials.internal.databaseaccess.DatabasePlatform; import oracle.toplink.essentials.mappings.OneToManyMapping; import oracle.toplink.essentials.mappings.OneToOneMapping; import oracle.toplink.essentials.sessions.Project; *************** *** 93,98 **** --- 93,101 ---- //the project object used to generate the default data schema. Project project = null; + //the target database platform + private DatabasePlatform databasePlatform; + //used to track the table definition: keyed by the table name, and valued //by the table definition object private Map tableMap = null; *************** *** 106,111 **** --- 109,115 ---- */ public DefaultTableGenerator(Project project) { this.project = project; + databasePlatform = project.getLogin().getPlatform(); tableMap = new HashMap(); fieldMap = new HashMap(); } *************** *** 124,130 **** //aggregate RelationalDescriptor does not contains table/field data if (!desc.isAggregateDescriptor()) { ! initTableSchema((ClassDescriptor)desc); } } --- 128,134 ---- //aggregate RelationalDescriptor does not contains table/field data if (!desc.isAggregateDescriptor()) { ! initTableSchema(desc); } } *************** *** 297,332 **** //first create relation table TableDefinition tblDef = getTableDefFromDBTable(mapping.getRelationTable()); - DatabaseField dbField = null; - DatabaseField parentDBField = null; - FieldDefinition fldDef = null; - //add source foreign key fields into the relation table Vector srcFkFields = mapping.getSourceRelationKeyFields(); ! for (int index = 0; index < srcFkFields.size(); index++) { ! parentDBField = (DatabaseField) mapping.getSourceKeyFields().get(index); ! dbField = resolveDatabaseField((DatabaseField) srcFkFields.get(index), parentDBField); ! setFieldToRelationTable(dbField, tblDef); ! setForeignKeyForRelationTable(dbField, parentDBField); ! } //add target foreign key fields into the relation table Vector targFkFields = mapping.getTargetRelationKeyFields(); ! ! for (int index = 0; index < targFkFields.size(); index++) { ! parentDBField = (DatabaseField) mapping.getTargetKeyFields().get(index); ! dbField = resolveDatabaseField((DatabaseField) targFkFields.get(index), parentDBField); ! setFieldToRelationTable(dbField, tblDef); ! setForeignKeyForRelationTable(dbField, parentDBField); ! } } ! private void setForeignKeyForRelationTable(final DatabaseField dbField, final DatabaseField parentDBField) { ! FieldDefinition fldDef; ! fldDef = getFieldDefFromDBField(dbField, false); ! fldDef.setForeignKeyFieldName(parentDBField.getTable().getName() + "." + parentDBField.getName()); ! return; } /** --- 301,345 ---- //first create relation table TableDefinition tblDef = getTableDefFromDBTable(mapping.getRelationTable()); //add source foreign key fields into the relation table Vector srcFkFields = mapping.getSourceRelationKeyFields(); + Vector srcKeyFields = mapping.getSourceKeyFields(); ! buildRelationTableFields(tblDef, srcFkFields, srcKeyFields); //add target foreign key fields into the relation table Vector targFkFields = mapping.getTargetRelationKeyFields(); ! Vector targKeyFields = mapping.getTargetKeyFields(); ! ! buildRelationTableFields(tblDef, targFkFields, targKeyFields); } ! /** ! * Build field definitions and foreign key constraints for all many-to-many relation table. ! */ ! private void buildRelationTableFields(TableDefinition tblDef, Vector fkFields, Vector targetFields) { ! assert fkFields.size() > 0 && fkFields.size() == targetFields.size(); ! ! DatabaseField fkField = null; ! DatabaseField targetField = null; ! Vector fkFieldNames = new Vector(); ! Vector targetFieldNames = new Vector(); ! ! for (int index = 0; index < fkFields.size(); index++) { ! fkField = (DatabaseField) fkFields.get(index); ! targetField = (DatabaseField) targetFields.get(index); ! fkFieldNames.add(fkField.getName()); ! targetFieldNames.add(targetField.getName()); ! ! fkField = resolveDatabaseField(fkField, targetField); ! setFieldToRelationTable(fkField, tblDef); ! } ! ! // add a foreign key constraint ! DatabaseTable targetTable = targetField.getTable(); ! TableDefinition targetTblDef = getTableDefFromDBTable(targetTable); ! ! addForeignKeyConstraint(tblDef, targetTblDef, fkFieldNames, targetFieldNames); } /** *************** *** 390,415 **** } private void addForeignKeyFieldToFieldDefinition(final Map srcFields) { DatabaseField dbSrcField = null; DatabaseField dbTrgField = null; //add source foreign key fields into the table for (Iterator srcFkFields = srcFields.keySet().iterator(); srcFkFields.hasNext();) { dbSrcField = (DatabaseField)srcFkFields.next(); dbTrgField = (DatabaseField)srcFields.get(dbSrcField); FieldDefinition srcFldDef = (FieldDefinition)fieldMap.get(dbSrcField); FieldDefinition trgFldDef = (FieldDefinition)fieldMap.get(dbTrgField); ! srcFldDef.setForeignKeyFieldName( ! dbTrgField.getTable().getQualifiedName() + "." + dbTrgField.getName()); ! ! // Also ensure that the type, size and subsize of the foreign key field is ! // same as that of the original field. ! srcFldDef.setType(trgFldDef.getType()); ! srcFldDef.setSize(trgFldDef.getSize()); ! srcFldDef.setSubSize(trgFldDef.getSubSize()); } } /** --- 403,443 ---- } private void addForeignKeyFieldToFieldDefinition(final Map srcFields) { + if(srcFields.size() == 0) { + return; + } + DatabaseField dbSrcField = null; DatabaseField dbTrgField = null; //add source foreign key fields into the table + Vector fkFieldNames = new Vector(); + Vector targetFieldNames = new Vector(); for (Iterator srcFkFields = srcFields.keySet().iterator(); srcFkFields.hasNext();) { dbSrcField = (DatabaseField)srcFkFields.next(); dbTrgField = (DatabaseField)srcFields.get(dbSrcField); + fkFieldNames.add(dbSrcField.getName()); + targetFieldNames.add(dbTrgField.getName()); FieldDefinition srcFldDef = (FieldDefinition)fieldMap.get(dbSrcField); FieldDefinition trgFldDef = (FieldDefinition)fieldMap.get(dbTrgField); ! if(srcFldDef != null && trgFldDef != null) { ! // Also ensure that the type, size and subsize of the foreign key field is ! // same as that of the original field. ! srcFldDef.setType(trgFldDef.getType()); ! srcFldDef.setSize(trgFldDef.getSize()); ! srcFldDef.setSubSize(trgFldDef.getSubSize()); ! } } + + // add a foreign key constraint + DatabaseTable sourceTable = dbSrcField.getTable(); + DatabaseTable targetTable = dbTrgField.getTable(); + TableDefinition sourceTableDef = getTableDefFromDBTable(sourceTable); + TableDefinition targetTableDef = getTableDefFromDBTable(targetTable); + + addForeignKeyConstraint(sourceTableDef, targetTableDef, fkFieldNames, targetFieldNames); } /** *************** *** 439,444 **** --- 467,475 ---- DatabaseField reslovedDatabaseField = new DatabaseField(); reslovedDatabaseField.setName(childField.getName()); reslovedDatabaseField.setType(getFieldDefFromDBField(parentField, true).getType()); + //Table should be set, otherwise other same name field will be used wrongly because equals() is true. + //Fix for GF#1392 the same name column for the entity and many-to-many table cause wrong pk constraint. + reslovedDatabaseField.setTable(childField.getTable()); return reslovedDatabaseField; } *************** *** 478,484 **** } if ((fieldType == null) || (!fieldType.isPrimitive() && ! (new DatabaseSessionImpl(project).getPlatform().getFieldTypeDefinition(fieldType) == null))) { //TODO: log a warning for inaccessiable type or not convertable type. AbstractSessionLog.getLog().log(SessionLog.FINEST, "field_type_set_to_java_lang_string", dbField.getQualifiedName(), fieldType); --- 509,515 ---- } if ((fieldType == null) || (!fieldType.isPrimitive() && ! (databasePlatform.getFieldTypeDefinition(fieldType) == null))) { //TODO: log a warning for inaccessiable type or not convertable type. AbstractSessionLog.getLog().log(SessionLog.FINEST, "field_type_set_to_java_lang_string", dbField.getQualifiedName(), fieldType); *************** *** 531,553 **** dbTbl = (DatabaseTable) dbTblIter.next(); Map srcFields = (HashMap)desc.getAdditionalTablePrimaryKeyFields().get(dbTbl); if (null != srcFields) { ! addJoinColumnsFkFieldToFieldDefinition(srcFields); } } } ! private void addJoinColumnsFkFieldToFieldDefinition(final Map srcFields) { ! DatabaseField dbSrcField = null; ! DatabaseField dbTrgField = null; //add source foreign key fields into the table ! for (Iterator srcFkFields = srcFields.keySet().iterator(); srcFkFields.hasNext();) { ! dbSrcField = (DatabaseField)srcFkFields.next(); ! dbTrgField = (DatabaseField)srcFields.get(dbSrcField); ! FieldDefinition srcFldDef = (FieldDefinition)fieldMap.get(dbSrcField); ! FieldDefinition trgFldDef = (FieldDefinition)fieldMap.get(dbTrgField); ! trgFldDef.setForeignKeyFieldName( ! dbSrcField.getTable().getQualifiedName() + "." + dbSrcField.getName()); ! } } } --- 562,688 ---- dbTbl = (DatabaseTable) dbTblIter.next(); Map srcFields = (HashMap)desc.getAdditionalTablePrimaryKeyFields().get(dbTbl); if (null != srcFields) { ! addJoinColumnsFkConstraint(srcFields); } } } ! private void addJoinColumnsFkConstraint(final Map srcFields) { ! if(srcFields.size() == 0) { ! return; ! } ! ! DatabaseField fkField = null; ! DatabaseField pkField = null; ! Vector fkFieldNames = new Vector(); ! Vector pkFieldNames = new Vector(); //add source foreign key fields into the table ! for (Iterator srcPkFields = srcFields.keySet().iterator(); srcPkFields.hasNext();) { ! pkField = (DatabaseField)srcPkFields.next(); ! fkField = (DatabaseField)srcFields.get(pkField); ! fkFieldNames.add(fkField.getName()); ! pkFieldNames.add(pkField.getName()); ! } ! ! // add a foreign key constraint ! DatabaseTable sourceTable = fkField.getTable(); ! DatabaseTable targetTable = pkField.getTable(); ! TableDefinition sourceTableDef = getTableDefFromDBTable(sourceTable); ! TableDefinition targetTableDef = getTableDefFromDBTable(targetTable); ! ! addForeignKeyConstraint(sourceTableDef, targetTableDef, fkFieldNames, pkFieldNames); ! } ! ! /** ! * Add a foreign key constraint to the source table. ! */ ! private void addForeignKeyConstraint(TableDefinition sourceTableDef, TableDefinition targetTableDef, ! Vector fkFields, Vector targetFields) { ! assert fkFields.size() > 0 && fkFields.size() == targetFields.size(); ! ! // target keys could be primary keys or candidate(unique) keys of the target table ! ! Vector fkFieldNames = fkFields; ! Vector targetFieldNames = targetFields; ! ! if (fkFields.size() > 1) { ! // if composite key, we should consider the order of keys. ! // Foreign Key constraint should follow the primary/unique key order of the target table. ! // e.g. if the primary key constraint of the target table is (p2, p1), ! // foreign key constraint should be "(f2, f1) REFERENCES TARGET (p2, p1)". ! ! // we try to reorder keys using primary keys or unique keys order of the target table, ! // but if we might not resolve it due to incorrect field name, then let it as it is. ! // This will trigger underlying database exception so users can recognize errors. ! ! boolean resolved = false; ! boolean error = false; ! ! Map targetToFkField = new HashMap(); ! for (int index = 0; index < fkFields.size(); index++) { ! String targetField = targetFields.get(index); ! if (targetToFkField.containsKey(targetField)) { ! //target key column appears more than once ! error = true; ! break; ! } ! targetToFkField.put(targetField, fkFields.get(index)); ! } ! ! Vector orderedFkFields = new Vector(fkFields.size()); ! Vector orderedTargetFields = new Vector(targetFields.size()); ! ! if (!error) { ! // if target fields are primary keys ! resolved = true; ! for (String pkField : (Vector)targetTableDef.getPrimaryKeyFieldNames()) { ! String fkField = targetToFkField.get(pkField); ! if (fkField == null) { ! //primary key column not found ! resolved = false; ! break; ! } ! orderedFkFields.add(fkField); ! orderedTargetFields.add(pkField); ! } ! } ! ! if (!error && !resolved) { ! // if target fields are unique keys ! for (Object uniqueConstraint : targetTableDef.getUniqueKeys()) { ! orderedFkFields.setSize(0); ! orderedTargetFields.setSize(0); ! ! resolved = true; ! for (String ukField : (String[])uniqueConstraint) { ! String fkField = targetToFkField.get(ukField); ! if (fkField == null) { ! //unique key column not found ! resolved = false; ! break; ! } ! orderedFkFields.add(fkField); ! orderedTargetFields.add(ukField); ! } ! if (resolved) { ! break; ! } ! } ! } ! ! if (resolved) { ! fkFieldNames = orderedFkFields; ! targetFieldNames = orderedTargetFields; ! } ! } ! ! // For bidirectional relationships both side of mapping will make the same FK constraint twice. ! // TableDefinition.addForeignKeyConstraint() will ignore the same FK constraint. ! ! ForeignKeyConstraint fkc = sourceTableDef.buildForeignKeyConstraint(fkFieldNames, targetFieldNames, ! targetTableDef, databasePlatform); ! sourceTableDef.addForeignKeyConstraint(fkc); } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/FieldDefinition.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000004/AB0952363AC40CBFE034080020E8C54E.7 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000004/AB0952363AC40CBFE034080020E8C54E.7 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/FieldDefinition.java Tue Nov 7 10:57:21 2006 *************** *** 18,24 **** * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2005, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.*; --- 18,24 ---- * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.*; *************** *** 50,56 **** protected boolean isUnique; protected String additional; protected String constraint; ! protected String foreignKeyFieldName; public FieldDefinition() { this.name = ""; --- 50,57 ---- protected boolean isUnique; protected String additional; protected String constraint; ! // @deprecated Use ForeignKeyConstraint instead. ! protected String foreignKeyFieldName; //fully-qualified foreign key field name public FieldDefinition() { this.name = ""; *************** *** 205,210 **** --- 206,216 ---- return constraint; } + /** + * PUBLIC: + * Return fully-qualified foreign key field name. + * @deprecated Use ForeignKeyConstraint instead. + */ public String getForeignKeyFieldName() { return foreignKeyFieldName; } *************** *** 296,301 **** --- 302,314 ---- constraint = string; } + /** + * PUBLIC: + * Set the foreign key field name. This value is used for a foreign key constraint. + * + * @param foreignKeyFieldName fully-qualified field name + * @deprecated Use ForeignKeyConstraint instead. + */ public void setForeignKeyFieldName(String foreignKeyFieldName) { this.foreignKeyFieldName = foreignKeyFieldName; } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/ForeignKeyConstraint.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000005/AB0952363AC40CBFE034080020E8C54E.5 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000005/AB0952363AC40CBFE034080020E8C54E.5 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/ForeignKeyConstraint.java Tue Nov 7 10:57:21 2006 *************** *** 18,24 **** * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2005, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.*; --- 18,24 ---- * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.*; *************** *** 33,41 **** */ public class ForeignKeyConstraint implements Serializable { protected String name; ! protected Vector sourceFields; ! protected Vector targetFields; ! protected String targetTable; protected boolean shouldCascadeOnDelete; public ForeignKeyConstraint() { --- 33,41 ---- */ public class ForeignKeyConstraint implements Serializable { protected String name; ! protected Vector sourceFields; //source(foreign key) field names ! protected Vector targetFields; //target(primary key) field names ! protected String targetTable; //fully-qualified target table name protected boolean shouldCascadeOnDelete; public ForeignKeyConstraint() { ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/SchemaManager.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000006/AB0952363AC40CBFE034080020E8C54E.14 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000006/AB0952363AC40CBFE034080020E8C54E.14 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/SchemaManager.java Tue Nov 7 10:57:21 2006 *************** *** 19,25 **** * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.Writer; --- 19,25 ---- * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.io.Writer; *************** *** 55,61 **** protected DatabaseSessionImpl session; protected Writer createSchemaWriter; protected Writer dropSchemaWriter; ! protected boolean createSQLFiles = true; public SchemaManager(DatabaseSessionImpl session) { this.session = session; --- 55,61 ---- protected DatabaseSessionImpl session; protected Writer createSchemaWriter; protected Writer dropSchemaWriter; ! protected boolean createSQLFiles = true; //if true, schema writer will add terminator string. public SchemaManager(DatabaseSessionImpl session) { this.session = session; *************** *** 112,120 **** */ public void closeDDLWriter() { closeDDLWriter(createSchemaWriter); ! if (null != dropSchemaWriter) { ! closeDDLWriter(dropSchemaWriter); ! } } public void closeDDLWriter(Writer schemaWriter) { --- 112,120 ---- */ public void closeDDLWriter() { closeDDLWriter(createSchemaWriter); ! closeDDLWriter(dropSchemaWriter); ! createSchemaWriter = null; ! dropSchemaWriter = null; } public void closeDDLWriter(Writer schemaWriter) { *************** *** 125,131 **** try { schemaWriter.flush(); schemaWriter.close(); - schemaWriter = null; } catch (java.io.IOException ioException) { throw ValidationException.fileError(ioException); } --- 125,130 ---- *************** *** 143,148 **** --- 142,165 ---- tableDefinition.createConstraints(getSession(), createSchemaWriter); } } + + void createUniqueConstraints(TableDefinition tableDefinition) throws TopLinkException { + if (shouldWriteToDatabase()) { + tableDefinition.createUniqueConstraintsOnDatabase(getSession()); + } else { + tableDefinition.setCreateSQLFiles(createSQLFiles); + tableDefinition.createUniqueConstraints(getSession(), createSchemaWriter); + } + } + + void createForeignConstraints(TableDefinition tableDefinition) throws TopLinkException { + if (shouldWriteToDatabase()) { + tableDefinition.createForeignConstraintsOnDatabase(getSession()); + } else { + tableDefinition.setCreateSQLFiles(createSQLFiles); + tableDefinition.createForeignConstraints(getSession(), createSchemaWriter); + } + } /** * Use the definition object to create the schema entity on the database. ================================================================================ Merge Diffs: /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/TableCreator.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000007/AB0952363AC40CBFE034080020E8C54E.5 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000007/AB0952363AC40CBFE034080020E8C54E.5 Mon Nov 6 14:28:29 2006 --- /ade/tware_toplink10i/tldev/source/essentials/oracle/toplink/essentials/tools/schemaframework/TableCreator.java Tue Nov 7 10:57:21 2006 *************** *** 18,24 **** * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2005, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.util.*; --- 18,24 ---- * own identifying information: Portions Copyright [yyyy] * [name of copyright owner] */ ! // Copyright (c) 1998, 2006, Oracle. All rights reserved. package oracle.toplink.essentials.tools.schemaframework; import java.util.*; *************** *** 75,82 **** schemaManager.buildFieldTypes((TableDefinition)enumtr.nextElement()); } for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createConstraints((TableDefinition)enumtr.nextElement()); } } --- 75,88 ---- schemaManager.buildFieldTypes((TableDefinition)enumtr.nextElement()); } + // Unique constraints should be generated before foreign key constraints, + // because foreign key constraints can reference unique constraints for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createUniqueConstraints((TableDefinition)enumtr.nextElement()); ! } ! ! for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createForeignConstraints((TableDefinition)enumtr.nextElement()); } } *************** *** 107,114 **** } } for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createConstraints((TableDefinition)enumtr.nextElement()); } schemaManager.createSequences(); --- 113,126 ---- } } + // Unique constraints should be generated before foreign key constraints, + // because foreign key constraints can reference unique constraints for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createUniqueConstraints((TableDefinition)enumtr.nextElement()); ! } ! ! for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createForeignConstraints((TableDefinition)enumtr.nextElement()); } schemaManager.createSequences(); *************** *** 252,259 **** } } for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createConstraints((TableDefinition)enumtr.nextElement()); } } --- 264,277 ---- } } + // Unique constraints should be generated before foreign key constraints, + // because foreign key constraints can reference unique constraints + for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { + schemaManager.createUniqueConstraints((TableDefinition)enumtr.nextElement()); + } + for (Enumeration enumtr = getTableDefinitions().elements(); enumtr.hasMoreElements();) { ! schemaManager.createForeignConstraints((TableDefinition)enumtr.nextElement()); } } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/tests/cmp3/ddlgeneration/DDLGenerationJUnitTestSuite.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000010/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000010/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:25 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/tests/cmp3/ddlgeneration/DDLGenerationJUnitTestSuite.java Tue Nov 7 10:55:25 2006 *************** *** 0 **** --- 1,150 ---- + package oracle.toplink.essentials.testing.tests.cmp3.ddlgeneration; + + import junit.extensions.TestSetup; + import junit.framework.Test; + import junit.framework.TestSuite; + import oracle.toplink.essentials.testing.framework.junit.JUnitTestCase; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityA; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityAPK; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityB; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityBPK; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityC; + import oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityCPK; + + import javax.persistence.EntityManager; + import java.util.HashMap; + import java.util.Map; + + /** + * JUnit test case(s) for DDL generation. + */ + public class DDLGenerationJUnitTestSuite extends JUnitTestCase { + + public DDLGenerationJUnitTestSuite() { + super(); + } + + public DDLGenerationJUnitTestSuite(String name) { + super(name); + } + + public static Test suite() { + TestSuite suite = new TestSuite(DDLGenerationJUnitTestSuite.class); + + return new TestSetup(suite) { + + protected void setUp() { + // Trigger DDL generation + //TODO: Let's add a flag which do not disregard DDL generation errors. + //TODO: This is required to ensure that DDL generation has succeeded. + EntityManager em = createEntityManager("ddlGeneration"); + em.close(); + } + + protected void tearDown() { + clearCache("ddlGeneration"); + } + }; + } + + // Test for GF#1392 + // If there is a same name column for the entity and many-to-many table, wrong pk constraint generated. + public void testDDLPkConstraintErrorIncludingRelationTableColumnName() { + EntityManager em = createEntityManager("ddlGeneration"); + em.getTransaction().begin(); + try { + + CKeyEntityC c = new CKeyEntityC(new CKeyEntityCPK("Manager")); + em.persist(c); + + em.getTransaction().commit(); + } catch (RuntimeException e) { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + fail("DDL generation may generate wrong Primary Key constraint, thrown:" + e); + } finally { + em.close(); + } + } + + // Test for relationships using candidate(unique) keys + public void testDDLUniqueKeysAsJoinColumns() { + CKeyEntityAPK aKey; + CKeyEntityBPK bKey; + + EntityManager em = createEntityManager("ddlGeneration"); + em.getTransaction().begin(); + try { + CKeyEntityA a = new CKeyEntityA("Wonseok", "Kim"); + CKeyEntityB b = new CKeyEntityB("B1209"); + //set unique keys + b.setUnq1("u0001"); + b.setUnq2("u0002"); + + a.setUniqueB(b); + b.setUniqueA(a); + + em.persist(a); + em.persist(b); + + em.getTransaction().commit(); + + aKey = a.getKey(); + bKey = b.getKey(); + } catch (RuntimeException e) { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + throw e; + } finally { + em.close(); + } + //clearCache("ddlGeneration"); + + em = createEntityManager("ddlGeneration"); + em.getTransaction().begin(); + try { + CKeyEntityA a = em.find(CKeyEntityA.class, aKey); + assertNotNull(a); + + CKeyEntityB b = a.getUniqueB(); + assertNotNull(b); + + assertEquals(b.getUnq1(), "u0001"); + assertEquals(b.getUnq2(), "u0002"); + + em.getTransaction().commit(); + } catch (RuntimeException e) { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + throw e; + } finally { + em.close(); + } + //clearCache("ddlGeneration"); + + em = createEntityManager("ddlGeneration"); + em.getTransaction().begin(); + try { + + CKeyEntityB b = em.find(CKeyEntityB.class, bKey); + assertNotNull(b); + + CKeyEntityA a = b.getUniqueA(); + assertNotNull(a); + assertEquals(a.getKey(), aKey); + + em.getTransaction().commit(); + } catch (RuntimeException e) { + if (em.getTransaction().isActive()) + em.getTransaction().rollback(); + throw e; + } finally { + em.close(); + } + + } + + public static void main(String[] args) { + junit.textui.TestRunner.run(suite()); + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityA.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000013/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000013/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:29 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityA.java Tue Nov 7 10:55:28 2006 *************** *** 0 **** --- 1,114 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Column; + import javax.persistence.Entity; + import javax.persistence.GeneratedValue; + import static javax.persistence.GenerationType.TABLE; + import javax.persistence.Id; + import javax.persistence.IdClass; + import javax.persistence.JoinColumn; + import javax.persistence.JoinColumns; + import javax.persistence.ManyToOne; + import javax.persistence.OneToOne; + import javax.persistence.Table; + import javax.persistence.TableGenerator; + import java.util.Collection; + + /** + * Composite key Entity. + * + * @author Wonseok Kim + */ + @Entity + @IdClass(CKeyEntityAPK.class) + @Table(name = "DDL_CKENTA") + @TableGenerator( + name = "CKEYENTITY_TABLE_GENERATOR", + table = "DDL_CKENT_SEQ", + pkColumnName = "SEQ_NAME", + valueColumnName = "SEQ_COUNT", + pkColumnValue = "CKENT_SEQ" + ) + public class CKeyEntityA { + @Id + @GeneratedValue(strategy = TABLE, generator = "CKEYENTITY_TABLE_GENERATOR") + @Column(name = "SEQ") + private int seq; + + @Id + @Column(name = "F_NAME") + private String firstName; + + @Id + @Column(name = "L_NAME") + private String lastName; + + @ManyToOne + @JoinColumns({ + @JoinColumn(name="B_SEQ", referencedColumnName = "SEQ"), + @JoinColumn(name="B_CODE", referencedColumnName = "CODE") + }) + private Collection bs; + + @OneToOne(mappedBy="a") + private CKeyEntityC c; + + // Relationship using candidate(unique) keys + // For testing whether a generated FK constraint has reordered unique keys according to target table. + // CKeyEntityB has unique constraint ("UNQ2", "UNQ1"). + @OneToOne + @JoinColumns({ + @JoinColumn(name="B_UNQ1", referencedColumnName = "UNQ1"), + @JoinColumn(name="B_UNQ2", referencedColumnName = "UNQ2") + }) + private CKeyEntityB uniqueB; + + + public CKeyEntityA() { + } + + public CKeyEntityA(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public int getSeq() { + return seq; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public CKeyEntityAPK getKey() { + return new CKeyEntityAPK(seq, firstName, lastName); + } + + public Collection getBs() { + return bs; + } + + public void setBs(Collection bs) { + this.bs = bs; + } + + public CKeyEntityC getC() { + return c; + } + + public void setC(CKeyEntityC c) { + this.c = c; + } + + public CKeyEntityB getUniqueB() { + return uniqueB; + } + + public void setUniqueB(CKeyEntityB uniqueB) { + this.uniqueB = uniqueB; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityAPK.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000014/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000014/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:32 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityAPK.java Tue Nov 7 10:55:32 2006 *************** *** 0 **** --- 1,37 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + /** + * @author Wonseok Kim + */ + public class CKeyEntityAPK { + public int seq; + public String firstName; + public String lastName; + + + public CKeyEntityAPK() { + } + + public CKeyEntityAPK(int seq, String firstName, String lastName) { + this.seq = seq; + this.firstName = firstName; + this.lastName = lastName; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CKeyEntityAPK that = (CKeyEntityAPK) o; + + return seq == that.seq && firstName.equals(that.firstName) && lastName.equals(that.lastName); + } + + public int hashCode() { + int result; + result = seq; + result = 31 * result + firstName.hashCode(); + result = 31 * result + lastName.hashCode(); + return result; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityB.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000015/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000015/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:36 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityB.java Tue Nov 7 10:55:35 2006 *************** *** 0 **** --- 1,114 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Column; + import javax.persistence.Entity; + import javax.persistence.GeneratedValue; + import static javax.persistence.GenerationType.TABLE; + import javax.persistence.Id; + import javax.persistence.IdClass; + import javax.persistence.Inheritance; + import javax.persistence.InheritanceType; + import javax.persistence.ManyToMany; + import javax.persistence.OneToMany; + import javax.persistence.OneToOne; + import javax.persistence.Table; + import javax.persistence.UniqueConstraint; + import java.util.Collection; + + /** + * Composite Key Entity. + * + * @author Wonseok Kim + */ + @Entity + @IdClass(CKeyEntityBPK.class) + @Inheritance(strategy = InheritanceType.JOINED) + @Table(name = "DDL_CKENTB", + uniqueConstraints = { + @UniqueConstraint(columnNames={"UNQ2, UNQ1"}) //The order of columns shoud not be changed. See CKeyEntityA. + }) + public class CKeyEntityB { + @Id + @GeneratedValue(strategy = TABLE, generator = "CKEYENTITY_TABLE_GENERATOR") + @Column(name = "SEQ") + private int seq; + + @Id + @Column(name = "CODE") + private String code; + + @Column(name = "UNQ1", nullable = false) + private String unq1; + + @Column(name = "UNQ2", nullable = false) + private String unq2; + + + @OneToMany(mappedBy="bs") + private Collection as; + + @ManyToMany(mappedBy="bs") + private Collection cs; + + @OneToOne(mappedBy="uniqueB") + private CKeyEntityA uniqueA; + + public CKeyEntityB() { + } + + public CKeyEntityB(String code) { + this.code = code; + } + + public int getSeq() { + return seq; + } + + public String getCode() { + return code; + } + + public CKeyEntityBPK getKey() { + return new CKeyEntityBPK(seq, code); + } + + public String getUnq1() { + return unq1; + } + + public void setUnq1(String unq1) { + this.unq1 = unq1; + } + + public String getUnq2() { + return unq2; + } + + public void setUnq2(String unq2) { + this.unq2 = unq2; + } + + public Collection getAs() { + return as; + } + + public void setAs(Collection as) { + this.as = as; + } + + public Collection getCs() { + return cs; + } + + public void setCs(Collection cs) { + this.cs = cs; + } + + public CKeyEntityA getUniqueA() { + return uniqueA; + } + + public void setUniqueA(CKeyEntityA uniqueA) { + this.uniqueA = uniqueA; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityB2.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000016/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000016/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:40 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityB2.java Tue Nov 7 10:55:39 2006 *************** *** 0 **** --- 1,19 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Entity; + import javax.persistence.PrimaryKeyJoinColumn; + import javax.persistence.PrimaryKeyJoinColumns; + import javax.persistence.Table; + + /** + * @author Wonseok Kim + */ + @Entity + @Table(name="DDL_CKEYENTB2") + @PrimaryKeyJoinColumns({ + @PrimaryKeyJoinColumn(name="SEQ", referencedColumnName="SEQ"), + @PrimaryKeyJoinColumn(name="CODE", referencedColumnName="CODE") + }) + public class CKeyEntityB2 extends CKeyEntityB { + + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityBPK.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000017/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000017/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:44 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityBPK.java Tue Nov 7 10:55:43 2006 *************** *** 0 **** --- 1,33 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + /** + * @author Wonseok Kim + */ + public class CKeyEntityBPK { + public int seq; + public String code; + + public CKeyEntityBPK() { + } + + public CKeyEntityBPK(int seq, String code) { + this.seq = seq; + this.code = code; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CKeyEntityBPK that = (CKeyEntityBPK) o; + + return seq == that.seq && code.equals(that.code); + } + + public int hashCode() { + int result; + result = seq; + result = 31 * result + (code != null ? code.hashCode() : 0); + return result; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityC.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000018/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000018/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:48 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityC.java Tue Nov 7 10:55:47 2006 *************** *** 0 **** --- 1,87 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Column; + import javax.persistence.EmbeddedId; + import javax.persistence.Entity; + import javax.persistence.JoinColumn; + import javax.persistence.JoinColumns; + import javax.persistence.JoinTable; + import javax.persistence.ManyToMany; + import javax.persistence.OneToOne; + import javax.persistence.Table; + import java.util.Collection; + + /** + * Composite Key Entity. + * + * @author Wonseok Kim + */ + @Entity + @Table(name = "DDL_CKENTC") + public class CKeyEntityC { + + @EmbeddedId + private CKeyEntityCPK key; + + // Test for GF#1392 + // If there is a same name column for the entity and many-to-many table, wrong pk constraint generated. + @Column(name="C_ROLE") + private String tempRole; + + @OneToOne + @JoinColumns({ + @JoinColumn(name="A_SEQ", referencedColumnName = "SEQ"), + @JoinColumn(name="A_L_NAME", referencedColumnName = "L_NAME"), + @JoinColumn(name="A_F_NAME", referencedColumnName = "F_NAME") + }) + private CKeyEntityA a; + + @ManyToMany + @JoinTable(name="DDL_CKENT_C_B", + joinColumns={ + @JoinColumn(name="C_SEQ", referencedColumnName="SEQ"), + @JoinColumn(name="C_ROLE", referencedColumnName="ROLE") + }, + inverseJoinColumns={ + @JoinColumn(name="B_SEQ", referencedColumnName = "SEQ"), + @JoinColumn(name="B_CODE", referencedColumnName = "CODE") + } + ) + private Collection bs; + + + public CKeyEntityC() { + } + + public CKeyEntityC(CKeyEntityCPK key) { + this.key = key; + } + + public CKeyEntityCPK getKey() { + return key; + } + + public String getTempRole() { + return tempRole; + } + + public void setTempRole(String tempRole) { + this.tempRole = tempRole; + } + + public CKeyEntityA getA() { + return a; + } + + public void setA(CKeyEntityA a) { + this.a = a; + } + + public Collection getBs() { + return bs; + } + + public void setBs(Collection bs) { + this.bs = bs; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityCPK.java vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000019/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000019/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:55:52 2006 --- /ade/tware_toplink10i/tltest/source/entity-persistence-tests/src/java/oracle/toplink/essentials/testing/models/cmp3/ddlgeneration/CKeyEntityCPK.java Tue Nov 7 10:55:51 2006 *************** *** 0 **** --- 1,43 ---- + package oracle.toplink.essentials.testing.models.cmp3.ddlgeneration; + + import javax.persistence.Column; + import javax.persistence.Embeddable; + import javax.persistence.GeneratedValue; + import static javax.persistence.GenerationType.TABLE; + + /** + * @author Wonseok Kim + */ + @Embeddable + public class CKeyEntityCPK { + @GeneratedValue(strategy = TABLE, generator = "CKEYENTITY_TABLE_GENERATOR") + @Column(name = "SEQ") + public int seq; + + @Column(name = "ROLE") + public String role; + + + public CKeyEntityCPK() { + } + + public CKeyEntityCPK(String role) { + this.role = role; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CKeyEntityCPK that = (CKeyEntityCPK) o; + + return seq == that.seq && role.equals(that.role); + } + + public int hashCode() { + int result; + result = seq; + result = 31 * result + role.hashCode(); + return result; + } + } ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/resource/essentials/ddl-generation-testmodel/META-INF/persistence.xml vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000020/AB0952363AC40CBFE034080020E8C54E.3 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000020/AB0952363AC40CBFE034080020E8C54E.3 Tue Nov 7 09:11:29 2006 --- /ade/tware_toplink10i/tltest/resource/essentials/ddl-generation-testmodel/META-INF/persistence.xml Tue Nov 7 10:57:21 2006 *************** *** 11,16 **** --- 11,17 ---- META-INF/merge-inherited-beers.xml META-INF/merge-inherited-consumer.xml META-INF/merge-inherited-certification.xml + META-INF/ddl-generation-model.xml oracle.toplink.essentials.testing.models.cmp3.xml.merge.inherited.EmbeddedSerialNumber *************** *** 24,40 **** - - - - - - --- 25,37 ---- + + ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/resource/essentials/ddl-generation-testmodel/META-INF/ddl-generation-model.xml vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000022/AB0952363AC40CBFE034080020E8C54E.0 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000022/AB0952363AC40CBFE034080020E8C54E.0 Tue Nov 7 10:56:01 2006 --- /ade/tware_toplink10i/tltest/resource/essentials/ddl-generation-testmodel/META-INF/ddl-generation-model.xml Tue Nov 7 10:56:00 2006 *************** *** 0 **** --- 1,10 ---- + + + oracle.toplink.essentials.testing.models.cmp3.ddlgeneration + + + + + + + ================================================================================ Merge Diffs: /ade/tware_toplink10i/tltest/build.xml vs. /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000023/AB0952363AC40CBFE034080020E8C54E.42 Report generated at Tue Nov 7 11:21:53 2006 -------------------------------------------------------------------------------- *** /net/stottnfs2.ca.oracle.com/vol/vol1/ade_ottawa_txn/tware/tware_10essentials_gf1072_table_generation_wonsoek_kim_061107/ade_storage/000023/AB0952363AC40CBFE034080020E8C54E.42 Tue Nov 7 09:39:40 2006 --- /ade/tware_toplink10i/tltest/build.xml Tue Nov 7 10:57:21 2006 *************** *** 387,393 **** dir="${compile.essentials.destdir}" includes="oracle/toplink/essentials/testing/models/cmp3/**" excludes="oracle/toplink/essentials/testing/models/cmp3/validationfailed/**, ! oracle/toplink/essentials/testing/models/cmp3/xml/**" /> --- 205,212 ----