diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java index 61f4476a3e..a9bf742411 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java @@ -65,6 +65,7 @@ import org.jooq.Record; import org.jooq.Schema; import org.jooq.Sequence; import org.jooq.Table; +import org.jooq.TableField; import org.jooq.UniqueKey; import org.jooq.util.xml.jaxb.InformationSchema; @@ -658,6 +659,22 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable return lookupKey(table, fk.getKey()); } + @SuppressWarnings("unchecked") + final ForeignKey copyFK(Table fkTable, UniqueKey uk, ForeignKey oldFk) { + Table ukTable = uk.getTable(); + + TableField[] oldFkFields = oldFk.getFieldsArray(); + 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]); + } + + return Internal.createForeignKey(fkTable, oldFk.getQualifiedName(), fkFields, uk, (TableField[]) ukfields, oldFk.enforced()); + } + @Override public int hashCode() { return ddl().hashCode(); diff --git a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java index 50ec2032b4..aef24411f1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java @@ -455,13 +455,7 @@ final class FilteredMeta extends AbstractMeta { else if (!uk.isPrimary() && uniqueKeyFilter != null && !uniqueKeyFilter.test(uk)) continue fkLoop; - TableField[] fields1 = fk.getFieldsArray(); - TableField[] fields2 = new TableField[fields1.length]; - - for (int i = 0; i < fields2.length; i++) - fields2[i] = (TableField) uk.getTable().field(fields1[i]); - - references.add(Internal.createForeignKey(this, fk.getQualifiedName(), fields1, uk, (TableField[]) fields2, fk.enforced())); + references.add(copyFK(this, uk, fk)); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ReferenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/ReferenceImpl.java index 931eda2118..f4e53c01f0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ReferenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ReferenceImpl.java @@ -226,6 +226,6 @@ final class ReferenceImpl extends AbstractKe final ConstraintEnforcementStep constraint0() { return DSL.constraint(getName()) .foreignKey(getFieldsArray()) - .references(uk.getTable(), uk.getFieldsArray()); + .references(uk.getTable(), getKeyFieldsArray()); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Snapshot.java b/jOOQ/src/main/java/org/jooq/impl/Snapshot.java index 99212cf9a1..72142452ce 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Snapshot.java +++ b/jOOQ/src/main/java/org/jooq/impl/Snapshot.java @@ -244,23 +244,13 @@ final class Snapshot extends AbstractMeta { return result; } - @SuppressWarnings({ "rawtypes", "unchecked" }) final void resolveReferences() { // TODO: Is there a better way than temporarily keeping the wrong // ReferenceImpl in this list until we "know better"? for (int i = 0; i < foreignKeys.size(); i++) { ForeignKey fk = foreignKeys.get(i); - - UniqueKey uk = lookupUniqueKey(fk); - foreignKeys.set(i, org.jooq.impl.Internal.createForeignKey( - this, - fk.getQualifiedName(), - fields(fk.getFieldsArray()), - uk, - fields(uk.getFieldsArray()), - fk.enforced() - )); + foreignKeys.set(i, copyFK(this, lookupUniqueKey(fk), fk)); } }