use of org.springframework.roo.addon.dbre.addon.model.ForeignKey in project spring-roo by spring-projects.
the class DbreMetadata method addOneToManyFields.
private void addOneToManyFields(final Table table) {
Validate.notNull(table, "Table required");
if (table.isJoinTable()) {
return;
}
for (final ForeignKey exportedKey : table.getExportedKeys()) {
final Table exportedKeyForeignTable = exportedKey.getForeignTable();
Validate.notNull(exportedKeyForeignTable, "Foreign key table for foreign key '%s' in table '%s' does not exist. One-to-many relationship not created", exportedKey.getName(), table.getFullyQualifiedTableName());
if (exportedKeyForeignTable.isJoinTable()) {
continue;
}
final String foreignTableName = exportedKeyForeignTable.getName();
final String foreignSchemaName = exportedKeyForeignTable.getSchema().getName();
final Table foreignTable = database.getTable(foreignTableName, foreignSchemaName);
Validate.notNull(foreignTable, "Related table '%s' could not be found but was referenced by table '%s'", exportedKeyForeignTable.getFullyQualifiedTableName(), table.getFullyQualifiedTableName());
if (isOneToOne(foreignTable, foreignTable.getImportedKey(exportedKey.getName()))) {
continue;
}
final Short keySequence = exportedKey.getKeySequence();
final String fieldSuffix = keySequence != null && keySequence > 0 ? String.valueOf(keySequence) : "";
JavaSymbolName fieldName = new JavaSymbolName(getInflectorPlural(DbreTypeUtils.suggestFieldName(foreignTableName)) + fieldSuffix);
JavaSymbolName mappedByFieldName = null;
if (exportedKey.getReferenceCount() == 1) {
final Reference reference = exportedKey.getReferences().iterator().next();
mappedByFieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(reference.getForeignColumnName()));
} else {
mappedByFieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(table) + fieldSuffix);
}
// Check for existence of same field - ROO-1691
while (true) {
if (!hasFieldInItd(fieldName)) {
break;
}
fieldName = new JavaSymbolName(fieldName.getSymbolName() + "_");
}
final FieldMetadataBuilder fieldBuilder = getOneToManyMappedByField(fieldName, mappedByFieldName, foreignTableName, foreignSchemaName, exportedKey.getOnUpdate(), exportedKey.getOnDelete());
addToBuilder(fieldBuilder);
// Exclude these fields in @RooToString to avoid circular references
// - ROO-1399
excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
}
}
use of org.springframework.roo.addon.dbre.addon.model.ForeignKey in project spring-roo by spring-projects.
the class DbreMetadata method getManyToManyOwningSideField.
private FieldMetadataBuilder getManyToManyOwningSideField(final JavaSymbolName fieldName, final Table joinTable, final Table inverseSideTable, final CascadeAction onUpdate, final CascadeAction onDelete) {
final JavaType element = DbreTypeUtils.findTypeForTable(managedEntities, inverseSideTable);
Validate.notNull(element, "Attempted to create many-to-many owning-side field '%s' in '%s' %s", fieldName, destination.getFullyQualifiedTypeName(), getErrorMsg(inverseSideTable.getFullyQualifiedTableName()));
final List<JavaType> params = Arrays.asList(element);
final JavaType fieldType = new JavaType(SET.getFullyQualifiedTypeName(), 0, DataType.TYPE, null, params);
// Add annotations to field
final List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>();
// Add @ManyToMany annotation
final AnnotationMetadataBuilder manyToManyBuilder = new AnnotationMetadataBuilder(MANY_TO_MANY);
annotations.add(manyToManyBuilder);
// Add @JoinTable annotation
final AnnotationMetadataBuilder joinTableBuilder = new AnnotationMetadataBuilder(JOIN_TABLE);
final List<AnnotationAttributeValue<?>> joinTableAnnotationAttributes = new ArrayList<AnnotationAttributeValue<?>>();
joinTableAnnotationAttributes.add(new StringAttributeValue(new JavaSymbolName(NAME), joinTable.getName()));
final Iterator<ForeignKey> iter = joinTable.getImportedKeys().iterator();
// Add "joinColumns" attribute containing nested @JoinColumn annotations
final List<NestedAnnotationAttributeValue> joinColumnArrayValues = new ArrayList<NestedAnnotationAttributeValue>();
final Set<Reference> firstKeyReferences = iter.next().getReferences();
for (final Reference reference : firstKeyReferences) {
final AnnotationMetadataBuilder joinColumnBuilder = getJoinColumnAnnotation(reference, firstKeyReferences.size() > 1);
joinColumnArrayValues.add(new NestedAnnotationAttributeValue(new JavaSymbolName(VALUE), joinColumnBuilder.build()));
}
joinTableAnnotationAttributes.add(new ArrayAttributeValue<NestedAnnotationAttributeValue>(new JavaSymbolName("joinColumns"), joinColumnArrayValues));
// Add "inverseJoinColumns" attribute containing nested @JoinColumn
// annotations
final List<NestedAnnotationAttributeValue> inverseJoinColumnArrayValues = new ArrayList<NestedAnnotationAttributeValue>();
final Set<Reference> lastKeyReferences = iter.next().getReferences();
for (final Reference reference : lastKeyReferences) {
final AnnotationMetadataBuilder joinColumnBuilder = getJoinColumnAnnotation(reference, lastKeyReferences.size() > 1);
inverseJoinColumnArrayValues.add(new NestedAnnotationAttributeValue(new JavaSymbolName(VALUE), joinColumnBuilder.build()));
}
joinTableAnnotationAttributes.add(new ArrayAttributeValue<NestedAnnotationAttributeValue>(new JavaSymbolName("inverseJoinColumns"), inverseJoinColumnArrayValues));
// Add attributes to a @JoinTable annotation builder
joinTableBuilder.setAttributes(joinTableAnnotationAttributes);
annotations.add(joinTableBuilder);
return new FieldMetadataBuilder(getId(), Modifier.PRIVATE, annotations, fieldName, fieldType);
}
use of org.springframework.roo.addon.dbre.addon.model.ForeignKey in project spring-roo by spring-projects.
the class DbreMetadata method addManyToOneFields.
private void addManyToOneFields(final Table table) {
// Add unique many-to-one fields
final Map<JavaSymbolName, FieldMetadataBuilder> uniqueFields = new LinkedHashMap<JavaSymbolName, FieldMetadataBuilder>();
for (final ForeignKey foreignKey : table.getImportedKeys()) {
final Table foreignTable = foreignKey.getForeignTable();
if (foreignTable == null || isOneToOne(table, foreignKey)) {
continue;
}
// Assume many-to-one multiplicity
JavaSymbolName fieldName = null;
final String foreignTableName = foreignTable.getName();
final String foreignSchemaName = foreignTable.getSchema().getName();
if (foreignKey.getReferenceCount() == 1) {
final Reference reference = foreignKey.getReferences().iterator().next();
fieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(reference.getLocalColumnName()));
} else {
final Short keySequence = foreignKey.getKeySequence();
final String fieldSuffix = keySequence != null && keySequence > 0 ? String.valueOf(keySequence) : "";
fieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(foreignTableName) + fieldSuffix);
}
final JavaType fieldType = DbreTypeUtils.findTypeForTableName(managedEntities, foreignTableName, foreignSchemaName);
Validate.notNull(fieldType, "Attempted to create many-to-one field '%s' in '%s' %s", fieldName, destination.getFullyQualifiedTypeName(), getErrorMsg(foreignTable.getFullyQualifiedTableName(), table.getFullyQualifiedTableName()));
// Fields are stored in a field-keyed map first before adding them
// to the builder.
// This ensures the fields from foreign keys with multiple columns
// will only get created once.
final FieldMetadataBuilder fieldBuilder = getOneToOneOrManyToOneField(fieldName, fieldType, foreignKey, MANY_TO_ONE, true);
uniqueFields.put(fieldName, fieldBuilder);
}
for (final FieldMetadataBuilder fieldBuilder : uniqueFields.values()) {
addToBuilder(fieldBuilder);
// Exclude these fields in @RooToString to avoid circular references
// - ROO-1399
excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
}
}
use of org.springframework.roo.addon.dbre.addon.model.ForeignKey in project spring-roo by spring-projects.
the class DbreMetadata method addOneToOneFields.
private void addOneToOneFields(final Table table) {
// Add unique one-to-one fields
final Map<JavaSymbolName, FieldMetadataBuilder> uniqueFields = new LinkedHashMap<JavaSymbolName, FieldMetadataBuilder>();
for (final ForeignKey foreignKey : table.getImportedKeys()) {
if (!isOneToOne(table, foreignKey)) {
continue;
}
final Table importedKeyForeignTable = foreignKey.getForeignTable();
Validate.notNull(importedKeyForeignTable, "Foreign key table for foreign key '%s' in table '%s' does not exist. One-to-one relationship not created", foreignKey.getName(), table.getFullyQualifiedTableName());
final String foreignTableName = importedKeyForeignTable.getName();
final String foreignSchemaName = importedKeyForeignTable.getSchema().getName();
final Short keySequence = foreignKey.getKeySequence();
final String fieldSuffix = keySequence != null && keySequence > 0 ? String.valueOf(keySequence) : "";
final JavaSymbolName fieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(foreignTableName) + fieldSuffix);
final JavaType fieldType = DbreTypeUtils.findTypeForTableName(managedEntities, foreignTableName, foreignSchemaName);
Validate.notNull(fieldType, "Attempted to create one-to-one field '%s' in '%s' %s", fieldName, destination.getFullyQualifiedTypeName(), getErrorMsg(importedKeyForeignTable.getFullyQualifiedTableName(), table.getFullyQualifiedTableName()));
// Fields are stored in a field-keyed map first before adding them
// to the builder.
// This ensures the fields from foreign keys with multiple columns
// will only get created once.
final FieldMetadataBuilder fieldBuilder = getOneToOneOrManyToOneField(fieldName, fieldType, foreignKey, ONE_TO_ONE, false);
uniqueFields.put(fieldName, fieldBuilder);
}
for (final FieldMetadataBuilder fieldBuilder : uniqueFields.values()) {
addToBuilder(fieldBuilder);
// Exclude these fields in @RooToString to avoid circular references
// - ROO-1399
excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
}
// Add one-to-one mapped-by fields
if (table.isJoinTable()) {
return;
}
for (final ForeignKey exportedKey : table.getExportedKeys()) {
final Table exportedKeyForeignTable = exportedKey.getForeignTable();
Validate.notNull(exportedKeyForeignTable, "Foreign key table for foreign key '%s' in table '%s' does not exist. One-to-one relationship not created", exportedKey.getName(), table.getFullyQualifiedTableName());
if (exportedKeyForeignTable.isJoinTable()) {
continue;
}
final String foreignTableName = exportedKeyForeignTable.getName();
final String foreignSchemaName = exportedKeyForeignTable.getSchema().getName();
final Table foreignTable = database.getTable(foreignTableName, foreignSchemaName);
Validate.notNull(foreignTable, "Related table '%s' could not be found but has a foreign-key reference to table '%s'", exportedKeyForeignTable.getFullyQualifiedTableName(), table.getFullyQualifiedTableName());
if (!isOneToOne(foreignTable, foreignTable.getImportedKey(exportedKey.getName()))) {
continue;
}
final Short keySequence = exportedKey.getKeySequence();
final String fieldSuffix = keySequence != null && keySequence > 0 ? String.valueOf(keySequence) : "";
JavaSymbolName fieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(foreignTableName) + fieldSuffix);
final JavaType fieldType = DbreTypeUtils.findTypeForTableName(managedEntities, foreignTableName, foreignSchemaName);
Validate.notNull(fieldType, "Attempted to create one-to-one mapped-by field '%s' in '%s' %s", fieldName, destination.getFullyQualifiedTypeName(), getErrorMsg(foreignTable.getFullyQualifiedTableName()));
// Check for existence of same field - ROO-1691
while (true) {
if (!hasFieldInItd(fieldName)) {
break;
}
fieldName = new JavaSymbolName(fieldName.getSymbolName() + "_");
}
final JavaSymbolName mappedByFieldName = new JavaSymbolName(DbreTypeUtils.suggestFieldName(table.getName()) + fieldSuffix);
final FieldMetadataBuilder fieldBuilder = getOneToOneMappedByField(fieldName, fieldType, mappedByFieldName, exportedKey.getOnUpdate(), exportedKey.getOnDelete());
addToBuilder(fieldBuilder);
// Exclude these fields in @RooToString to avoid circular references
// - ROO-1399
excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
}
}
use of org.springframework.roo.addon.dbre.addon.model.ForeignKey in project spring-roo by spring-projects.
the class DbreMetadata method addManyToManyFields.
private void addManyToManyFields(final Table table) {
final Map<Table, Integer> owningSideTables = new LinkedHashMap<Table, Integer>();
final Map<JavaSymbolName, FieldMetadataBuilder> uniqueOwningSideFields = new LinkedHashMap<JavaSymbolName, FieldMetadataBuilder>();
final Map<JavaSymbolName, FieldMetadataBuilder> uniqueInverseSideFields = new LinkedHashMap<JavaSymbolName, FieldMetadataBuilder>();
for (final Table joinTable : database.getTables()) {
if (!joinTable.isJoinTable()) {
continue;
}
final String errMsg = "table in join table '" + joinTable.getName() + "' for many-to-many relationship could not be found. Note that table names are case sensitive in some databases such as MySQL.";
final Iterator<ForeignKey> iter = joinTable.getImportedKeys().iterator();
// First foreign key in set
final ForeignKey foreignKey1 = iter.next();
// Second and last foreign key in set
final ForeignKey foreignKey2 = iter.next();
final Table owningSideTable = foreignKey1.getForeignTable();
Validate.notNull(owningSideTable, "Owning-side %s", errMsg);
final Table inverseSideTable = foreignKey2.getForeignTable();
Validate.notNull(inverseSideTable, "Inverse-side %s", errMsg);
final Integer tableCount = owningSideTables.containsKey(owningSideTable) ? owningSideTables.get(owningSideTable) + 1 : 0;
owningSideTables.put(owningSideTable, tableCount);
final String fieldSuffix = owningSideTables.get(owningSideTable) > 0 ? String.valueOf(owningSideTables.get(owningSideTable)) : "";
final boolean sameTable = owningSideTable.equals(inverseSideTable);
if (owningSideTable.equals(table)) {
final JavaSymbolName fieldName = new JavaSymbolName(getInflectorPlural(DbreTypeUtils.suggestFieldName(inverseSideTable)) + (sameTable ? "1" : fieldSuffix));
final FieldMetadataBuilder fieldBuilder = getManyToManyOwningSideField(fieldName, joinTable, inverseSideTable, foreignKey1.getOnUpdate(), foreignKey1.getOnDelete());
uniqueOwningSideFields.put(fieldName, fieldBuilder);
}
if (inverseSideTable.equals(table)) {
final JavaSymbolName fieldName = new JavaSymbolName(getInflectorPlural(DbreTypeUtils.suggestFieldName(owningSideTable)) + (sameTable ? "2" : fieldSuffix));
final JavaSymbolName mappedByFieldName = new JavaSymbolName(getInflectorPlural(DbreTypeUtils.suggestFieldName(inverseSideTable)) + (sameTable ? "1" : fieldSuffix));
final FieldMetadataBuilder fieldBuilder = getManyToManyInverseSideField(fieldName, mappedByFieldName, owningSideTable, foreignKey2.getOnUpdate(), foreignKey2.getOnDelete());
uniqueInverseSideFields.put(fieldName, fieldBuilder);
}
}
// Add unique owning-side many-to-one fields
for (final FieldMetadataBuilder fieldBuilder : uniqueOwningSideFields.values()) {
addToBuilder(fieldBuilder);
// Exclude these fields in @RooToString to avoid circular references
// - ROO-1399
excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
}
// Add unique inverse-side many-to-one fields
for (final FieldMetadataBuilder fieldBuilder : uniqueInverseSideFields.values()) {
addToBuilder(fieldBuilder);
// Exclude these fields in @RooToString to avoid circular references
// - ROO-1399
excludeFieldsInToStringAnnotation(fieldBuilder.getFieldName().getSymbolName());
}
}
Aggregations