diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java index a9bf742411..acfc4ac70f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java @@ -660,16 +660,17 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable } @SuppressWarnings("unchecked") - final ForeignKey copyFK(Table fkTable, UniqueKey uk, ForeignKey oldFk) { + static final ForeignKey copyFK(Table fkTable, UniqueKey uk, ForeignKey oldFk) { Table ukTable = uk.getTable(); TableField[] oldFkFields = oldFk.getFieldsArray(); + TableField[] oldUkFields = oldFk.getKeyFieldsArray(); TableField[] fkFields = new TableField[oldFkFields.length]; TableField[] ukfields = new TableField[oldFkFields.length]; for (int i = 0; i < oldFkFields.length; i++) { fkFields[i] = (TableField) fkTable.field(oldFkFields[i]); - ukfields[i] = (TableField) ukTable.field(oldFkFields[i]); + ukfields[i] = (TableField) ukTable.field(oldUkFields[i]); } return Internal.createForeignKey(fkTable, oldFk.getQualifiedName(), fkFields, uk, (TableField[]) ukfields, oldFk.enforced()); diff --git a/jOOQ/src/main/java/org/jooq/impl/DDL.java b/jOOQ/src/main/java/org/jooq/impl/DDL.java index 30ca689e66..59ccb5c2e8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDL.java @@ -299,7 +299,7 @@ final class DDL { if (configuration.flags().contains(FOREIGN_KEY) && (table.getType() != VIEW || configuration.includeConstraintsOnViews())) for (ForeignKey key : sortKeysIf(table.getReferences(), !configuration.respectConstraintOrder())) - result.add(enforced(constraint(key.getUnqualifiedName()).foreignKey(key.getFieldsArray()).references(key.getKey().getTable(), key.getKey().getFieldsArray()), key.enforced())); + result.add(enforced(constraint(key.getUnqualifiedName()).foreignKey(key.getFieldsArray()).references(key.getKey().getTable(), key.getKeyFieldsArray()), key.enforced())); return result; } diff --git a/jOOQ/src/main/java/org/jooq/impl/Interpreter.java b/jOOQ/src/main/java/org/jooq/impl/Interpreter.java index 266bb321c0..f85bd6c12f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Interpreter.java +++ b/jOOQ/src/main/java/org/jooq/impl/Interpreter.java @@ -382,13 +382,13 @@ final class Interpreter { if (!mrfs.isEmpty()) mu = mrf.uniqueKey(mrfs); else if (mrf.primaryKey != null && mrf.primaryKey.fields.size() == mfs.size()) - mu = mrf.primaryKey; + mrfs = (mu = mrf.primaryKey).fields; if (mu == null) throw primaryKeyNotExists(impl.$referencesTable()); mt.foreignKeys.add(new MutableForeignKey( - (UnqualifiedName) impl.getUnqualifiedName(), mt, mfs, mu, impl.$onDelete(), impl.$onUpdate(), impl.$enforced() + (UnqualifiedName) impl.getUnqualifiedName(), mt, mfs, mu, mrfs, impl.$onDelete(), impl.$onUpdate(), impl.$enforced() )); } @@ -2003,7 +2003,8 @@ final class Interpreter { } private final class MutableForeignKey extends MutableKey { - MutableUniqueKey referencedKey; + MutableUniqueKey referencedKey; + List referencedFields; // TODO: Support these Action onDelete; @@ -2014,6 +2015,7 @@ final class Interpreter { MutableTable table, List fields, MutableUniqueKey referencedKey, + List referencedFields, Action onDelete, Action onUpdate, boolean enforced @@ -2022,6 +2024,7 @@ final class Interpreter { this.referencedKey = referencedKey; this.referencedKey.referencingKeys.add(this); + this.referencedFields = referencedFields; this.onDelete = onDelete; this.onUpdate = onUpdate; } @@ -2041,7 +2044,7 @@ final class Interpreter { return super.qualifiedName(); } - final ReferenceImpl interpretedKey() { + final ForeignKey interpretedKey() { Name qualifiedName = qualifiedName(); ReferenceImpl result = interpretedForeignKeys.get(qualifiedName); @@ -2053,8 +2056,8 @@ final class Interpreter { TableField[] fkFields = new TableField[fields.size()]; for (int i = 0; i < fkFields.length; i++) { - ukFields[i] = (TableField) uk.getTable().field(fields.get(i).name()); fkFields[i] = (TableField) t.field(fields.get(i).name()); + ukFields[i] = (TableField) uk.getTable().field(referencedFields.get(i).name()); } interpretedForeignKeys.put(qualifiedName, result = new ReferenceImpl<>(