/** * Construct the default TableCreator. * If the default TableCreator is already created, just returns it. */ protected TableCreator getDefaultTableCreator(boolean generateFKConstraints) { if(defaultTableCreator == null) { defaultTableCreator = new DefaultTableGenerator(session.getProject(),generateFKConstraints).generateDefaultTableCreator(); defaultTableCreator.setIgnoreDatabaseException(true); } return defaultTableCreator; }
/** * Build relation table definitions for all many-to-many relationships in a EclipseLink descriptor. */ private void buildRelationTableDefinition(RelationTableMechanism relationTableMechanism, DatabaseField listOrderField, ContainerPolicy cp) { //first create relation table TableDefinition tblDef = getTableDefFromDBTable(relationTableMechanism.getRelationTable()); //add source foreign key fields into the relation table Vector srcFkFields = relationTableMechanism.getSourceRelationKeyFields(); Vector srcKeyFields = relationTableMechanism.getSourceKeyFields(); buildRelationTableFields(tblDef, srcFkFields, srcKeyFields); //add target foreign key fields into the relation table Vector targFkFields = relationTableMechanism.getTargetRelationKeyFields(); Vector targKeyFields = relationTableMechanism.getTargetKeyFields(); buildRelationTableFields(tblDef, targFkFields, targKeyFields); if (cp != null){ addFieldsForMappedKeyMapContainerPolicy(cp, tblDef); } if(listOrderField != null) { tblDef.addField(getFieldDefFromDBField(listOrderField, false)); } }
/** * 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<String> fkFieldNames = new Vector(); Vector<String> targetFieldNames = new Vector(); for (int index = 0; index < fkFields.size(); index++) { fkField = (DatabaseField) fkFields.get(index); targetField = (DatabaseField) targetFields.get(index); fkFieldNames.add(fkField.getNameDelimited(databasePlatform)); targetFieldNames.add(targetField.getNameDelimited(databasePlatform)); fkField = resolveDatabaseField(fkField, targetField); setFieldToRelationTable(fkField, tblDef); } // add a foreign key constraint from fk field to target field DatabaseTable targetTable = targetField.getTable(); TableDefinition targetTblDef = getTableDefFromDBTable(targetTable); addForeignKeyConstraint(tblDef, targetTblDef, fkFieldNames, targetFieldNames); }
buildRelationTableDefinition(((ManyToManyMapping)mapping).getRelationTableMechanism(), ((ManyToManyMapping)mapping).getListOrderField(), mapping.getContainerPolicy()); } else if (mapping.isDirectCollectionMapping()) { buildDirectCollectionTableDefinition((DirectCollectionMapping) mapping, desc); } else if (mapping.isDirectToFieldMapping()) { Converter converter = ((DirectToFieldMapping)mapping).getConverter(); if (converter != null) { if (converter instanceof TypeConversionConverter) { resetFieldTypeForLOB((DirectToFieldMapping)mapping); getFieldDefFromDBField(mapping.getField(), false).setType(Byte[].class); createAggregateTargetTable((AggregateCollectionMapping) mapping); } else if (mapping.isForeignReferenceMapping()) { if (mapping.isOneToOneMapping()) { RelationTableMechanism relationTableMechanism = ((OneToOneMapping)mapping).getRelationTableMechanism(); if(relationTableMechanism == null) { addForeignKeyFieldToSourceTargetTable((OneToOneMapping) mapping); } else { buildRelationTableDefinition(relationTableMechanism, null, null); addForeignKeyFieldToSourceTargetTable((OneToManyMapping) mapping); TableDefinition targTblDef = getTableDefFromDBTable(((OneToManyMapping)mapping).getReferenceDescriptor().getDefaultTable()); addFieldsForMappedKeyMapContainerPolicy(mapping.getContainerPolicy(), targTblDef); resetTransformedFieldType((TransformationMapping) mapping); } else if (mapping.isAggregateObjectMapping()){ postInitTableSchema(((AggregateObjectMapping)mapping).getReferenceDescriptor()); processAdditionalTablePkFields(desc);
TableDefinition targetTable = getTableDefFromDBTable(mapping.getReferenceDescriptor().getDefaultTable()); addFieldsForMappedKeyMapContainerPolicy(mapping.getContainerPolicy(), targetTable); DatabaseField dbField = (DatabaseField) aggregateFieldIterator.next(); FieldDefinition fieldDef = getFieldDefFromDBField(dbField); if (!targetTable.getFields().contains(fieldDef)) { targetTable.addField(fieldDef); targetFieldNames.add(targetField.getNameDelimited(databasePlatform)); fkField = resolveDatabaseField(fkField, targetField); FieldDefinition fieldDef = getFieldDefFromDBField(fkField); if (!targetTable.getFields().contains(fieldDef)) { targetTable.addField(fieldDef); TableDefinition sourceTable = getTableDefFromDBTable(sourceDatabaseTable); FieldDefinition fieldDef = getFieldDefFromDBField(mapping.getListOrderField()); TableDefinition table = getTableDefFromDBTable(mapping.getListOrderField().getTable()); if (!table.getFields().contains(fieldDef)) { table.addField(fieldDef); return; addForeignKeyConstraint(targetTable, sourceTable, fkFieldNames, targetFieldNames, mapping.isCascadeOnDeleteSetOnDatabase());
/** * Build direct collection table definitions in a EclipseLink descriptor */ private void buildDirectCollectionTableDefinition(DirectCollectionMapping mapping, ClassDescriptor desc) { //first create direct collection table TableDefinition tblDef = getTableDefFromDBTable(mapping.getReferenceTable()); DatabaseField dbField = null; //add the table reference key(s) Vector refPkFields = mapping.getReferenceKeyFields(); for (int index = 0; index < refPkFields.size(); index++) { dbField = resolveDatabaseField((DatabaseField) refPkFields.get(index), mapping.getSourceKeyFields().get(index)); tblDef.addField(getDirectCollectionReferenceKeyFieldDefFromDBField(dbField)); } //add the direct collection field to the table. tblDef.addField(getFieldDefFromDBField(mapping.getDirectField(), false)); //if the mapping is direct-map field, add the direct key field to the table as well. // TODO: avoid generating DDL for map key mappings for the time being. // Bug: 270814 if (mapping.isDirectMapMapping() && ! mapping.getContainerPolicy().isMappedKeyMapPolicy() ) { dbField = ((DirectMapMapping) mapping).getDirectKeyField(); tblDef.addField(getFieldDefFromDBField(dbField, false)); } else { addFieldsForMappedKeyMapContainerPolicy(mapping.getContainerPolicy(), tblDef); if(mapping.getListOrderField() != null) { tblDef.addField(getFieldDefFromDBField(mapping.getListOrderField(), false)); } } }
private void addForeignKeyFieldToSourceTargetTable(OneToManyMapping mapping) { addForeignMappingFkConstraint(mapping.getTargetForeignKeysToSourceKeys()); if(mapping.getListOrderField() != null) { getTableDefFromDBTable(mapping.getListOrderField().getTable()).addField(getFieldDefFromDBField(mapping.getListOrderField(), false)); } }
TableDefinition sourceTableDef = getTableDefFromDBTable(sourceTable); fkFieldDef = getFieldDefFromDBField(fkField, false); if (!sourceTableDef.getFields().contains(fkFieldDef)) { sourceTableDef.addField(fkFieldDef); TableDefinition targetTableDef = getTableDefFromDBTable(targetTable); addForeignKeyConstraint(sourceTableDef, targetTableDef, fkFieldNames, targetFieldNames);
public void createTables(boolean generateFKConstraints, DynamicType... entityTypes) { AbstractSession createSession = getSession(); TableCreator creator = new DefaultTableGenerator(getSession().getProject(), generateFKConstraints).generateFilteredDefaultTableCreator(createSession); creator.setIgnoreDatabaseException(true); creator.createTables((DatabaseSession) getSession(), this); }
/** * Add the foreign key to the aggregate collection mapping target table. * Also add listOrderField if specified. */ private void createAggregateTargetTable(AggregateCollectionMapping mapping) { TableDefinition targTblDef = getTableDefFromDBTable(mapping.getReferenceDescriptor().getDefaultTable()); addFieldsForMappedKeyMapContainerPolicy(mapping.getContainerPolicy(), targTblDef); Iterator aggregateFieldIterator = mapping.getReferenceDescriptor().getFields().iterator(); while (aggregateFieldIterator.hasNext()) { DatabaseField dbField = (DatabaseField) aggregateFieldIterator.next(); //add the target foreign key field definition to the table definition targTblDef.addField(getFieldDefFromDBField(dbField, false)); } //unlike normal one-to-many mapping, aggregate collection mapping does not have 1:1 back reference //mapping, so the target foreign key fields are not stored in the target descriptor. Iterator targFKIter = mapping.getTargetForeignKeyFields().iterator(); while (targFKIter.hasNext()) { DatabaseField dbField = (DatabaseField) targFKIter.next(); //add the target foreign key field definition to the table definition targTblDef.addField(getFieldDefFromDBField(dbField, false)); } if(mapping.getListOrderField() != null) { getTableDefFromDBTable(mapping.getListOrderField().getTable()).addField(getFieldDefFromDBField(mapping.getListOrderField(), false)); } }
/** * The ContainerPolicy may contain some additional fields that should be added to the table * * @see MappedKeyMapContainerPolicy * @param cp * @param tblDef */ private void addFieldsForMappedKeyMapContainerPolicy(ContainerPolicy cp, TableDefinition tblDef){ if (cp.isMappedKeyMapPolicy()){ List<DatabaseField> keyFields = cp.getIdentityFieldsForMapKey(); Iterator<DatabaseField> i = keyFields.iterator(); while (i.hasNext()){ DatabaseField foreignKey = i.next(); FieldDefinition fieldDef = getFieldDefFromDBField(foreignKey, false); if (!tblDef.getFields().contains(fieldDef)) { tblDef.addField(getFieldDefFromDBField(foreignKey, false)); } } Map<DatabaseField, DatabaseField> foreignKeys = ((MappedKeyMapContainerPolicy)cp).getForeignKeyFieldsForMapKey(); if (foreignKeys != null){ addForeignMappingFkConstraint(foreignKeys); } } }
protected void addForeignMappingFkConstraint(final Map<DatabaseField, DatabaseField> srcFields, boolean cascadeOnDelete) { // srcFields map from the foreign key field to the target key field if(srcFields.size() == 0) { return; } List<DatabaseField> fkFields = new ArrayList<DatabaseField>(); List<DatabaseField> targetFields = new ArrayList<DatabaseField>(); for (Map.Entry<DatabaseField, DatabaseField> field : srcFields.entrySet()) { fkFields.add(field.getKey()); targetFields.add(field.getValue()); } addJoinColumnsFkConstraint(fkFields, targetFields, cascadeOnDelete); }
private void addForeignKeyFieldToSourceTargetTable(OneToOneMapping mapping) { if (!mapping.isForeignKeyRelationship()) { return; } addForeignMappingFkConstraint(mapping.getSourceToTargetKeyFields()); }
/** * Build a table definition object from a database table object */ private TableDefinition getTableDefFromDBTable(DatabaseTable dbTbl) { TableDefinition tblDef = this.tableMap.get(dbTbl.getName()); if (tblDef == null) { //table not built yet, simply built it tblDef = new TableDefinition(); tblDef.setName(dbTbl.getNameDelimited(databasePlatform)); tblDef.setQualifier(dbTbl.getTableQualifier()); addUniqueKeyConstraints(tblDef, dbTbl.getUniqueConstraints()); tableMap.put(dbTbl.getName(), tblDef); } return tblDef; }
buildRelationTableDefinition((ManyToManyMapping)mapping, ((ManyToManyMapping)mapping).getRelationTableMechanism(), ((ManyToManyMapping)mapping).getListOrderField(), mapping.getContainerPolicy()); } else if (mapping.isDirectCollectionMapping()) { buildDirectCollectionTableDefinition((DirectCollectionMapping) mapping, descriptor); } else if (mapping.isDirectToFieldMapping()) { Converter converter = ((DirectToFieldMapping)mapping).getConverter(); if (converter != null) { if (converter instanceof TypeConversionConverter) { resetFieldTypeForLOB((DirectToFieldMapping)mapping); getFieldDefFromDBField(mapping.getField()).setType(((SerializedObjectConverter)converter).getSerializer().getType()); createAggregateTargetTable((AggregateCollectionMapping) mapping); } else if (mapping.isForeignReferenceMapping()) { if (mapping.isOneToOneMapping()) { RelationTableMechanism relationTableMechanism = ((OneToOneMapping)mapping).getRelationTableMechanism(); if(relationTableMechanism == null) { addForeignKeyFieldToSourceTargetTable((OneToOneMapping) mapping); } else { buildRelationTableDefinition((OneToOneMapping)mapping, relationTableMechanism, null, null); addForeignKeyFieldToSourceTargetTable((OneToManyMapping) mapping); TableDefinition targTblDef = getTableDefFromDBTable(((OneToManyMapping)mapping).getReferenceDescriptor().getDefaultTable()); addFieldsForMappedKeyMapContainerPolicy(mapping.getContainerPolicy(), targTblDef); resetTransformedFieldType((TransformationMapping) mapping); } else if (mapping.isAggregateObjectMapping()){ postInitTableSchema(((AggregateObjectMapping)mapping).getReferenceDescriptor()); processAdditionalTablePkFields(descriptor);
TableDefinition targetTable = getTableDefFromDBTable(mapping.getReferenceDescriptor().getDefaultTable()); addFieldsForMappedKeyMapContainerPolicy(mapping.getContainerPolicy(), targetTable); DatabaseField dbField = (DatabaseField) aggregateFieldIterator.next(); FieldDefinition fieldDef = getFieldDefFromDBField(dbField); if (!targetTable.getFields().contains(fieldDef)) { targetTable.addField(fieldDef); targetFieldNames.add(targetField.getNameDelimited(databasePlatform)); fkField = resolveDatabaseField(fkField, targetField); FieldDefinition fieldDef = getFieldDefFromDBField(fkField); if (!targetTable.getFields().contains(fieldDef)) { targetTable.addField(fieldDef); TableDefinition sourceTable = getTableDefFromDBTable(sourceDatabaseTable); FieldDefinition fieldDef = getFieldDefFromDBField(mapping.getListOrderField()); TableDefinition table = getTableDefFromDBTable(mapping.getListOrderField().getTable()); if (!table.getFields().contains(fieldDef)) { table.addField(fieldDef); return; addForeignKeyConstraint(targetTable, sourceTable, fkFieldNames, targetFieldNames, mapping.isCascadeOnDeleteSetOnDatabase());
protected void addForeignKeyFieldToSourceTargetTable(OneToManyMapping mapping) { if (mapping.getDescriptor().hasTablePerClassPolicy()) { return; } addForeignMappingFkConstraint(mapping.getTargetForeignKeysToSourceKeys(), mapping.isCascadeOnDeleteSetOnDatabase()); if (mapping.getListOrderField() != null) { FieldDefinition fieldDef = getFieldDefFromDBField(mapping.getListOrderField()); TableDefinition table = getTableDefFromDBTable(mapping.getListOrderField().getTable()); if (!table.getFields().contains(fieldDef)) { table.addField(fieldDef); } } }
TableDefinition sourceTableDef = getTableDefFromDBTable(sourceTable); fkFieldDef = getFieldDefFromDBField(fkField); if (!sourceTableDef.getFields().contains(fkFieldDef)) { sourceTableDef.addField(fkFieldDef); TableDefinition targetTableDef = getTableDefFromDBTable(targetTable); addForeignKeyConstraint(sourceTableDef, targetTableDef, fkFieldNames, targetFieldNames, cascadeOnDelete);
public void createTables(boolean generateFKConstraints, Collection<DynamicType> entityTypes) { AbstractSession createSession = getSession(); TableCreator creator = new DefaultTableGenerator(getSession().getProject(), generateFKConstraints).generateFilteredDefaultTableCreator(createSession); creator.setIgnoreDatabaseException(true); creator.createTables((DatabaseSession) getSession(), this); }
/** * The ContainerPolicy may contain some additional fields that should be added to the table * * @see MappedKeyMapContainerPolicy */ protected void addFieldsForMappedKeyMapContainerPolicy(ContainerPolicy cp, TableDefinition table){ if (cp.isMappedKeyMapPolicy()){ List<DatabaseField> keyFields = cp.getIdentityFieldsForMapKey(); Iterator<DatabaseField> i = keyFields.iterator(); while (i.hasNext()){ DatabaseField foreignKey = i.next(); FieldDefinition fieldDef = getFieldDefFromDBField(foreignKey); if (!table.getFields().contains(fieldDef)) { table.addField(fieldDef); } } Map<DatabaseField, DatabaseField> foreignKeys = ((MappedKeyMapContainerPolicy)cp).getForeignKeyFieldsForMapKey(); if (foreignKeys != null){ addForeignMappingFkConstraint(foreignKeys, false); } } }