From 9fc2e2cd6137c3c8967fadd90dc8a20e237ba7a6 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 28 Jan 2020 17:27:56 +0100 Subject: [PATCH] [jOOQ/jOOQ#3521] Implement JDBCDatabase.loadForeignKeys() --- .../org/jooq/meta/AbstractMetaDatabase.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractMetaDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractMetaDatabase.java index a72c67b010..58efd2d2f2 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractMetaDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractMetaDatabase.java @@ -47,6 +47,7 @@ import java.util.List; import org.jooq.Catalog; import org.jooq.DSLContext; import org.jooq.Field; +import org.jooq.ForeignKey; import org.jooq.Meta; import org.jooq.Schema; import org.jooq.Sequence; @@ -98,6 +99,51 @@ public abstract class AbstractMetaDatabase extends AbstractDatabase { @Override protected void loadForeignKeys(DefaultRelations relations) throws SQLException { + for (Schema referencingS : getSchemasFromMeta()) { + SchemaDefinition referencingSD = getSchema(referencingS.getName()); + + if (referencingSD != null) { + for (Table referencingT : referencingS.getTables()) { + TableDefinition referencingTD = getTable(referencingSD, referencingT.getName()); + + if (referencingTD != null) { + for (ForeignKey fk : referencingT.getReferences()) { + + UniqueKey uk = fk.getKey(); + if (uk != null) { + Table referencedT = uk.getTable(); + + if (referencedT != null) { + Schema referencedS = referencedT.getSchema(); + + if (referencedS == null) + referencedS = referencingS; + + SchemaDefinition referencedSD = getSchema(referencedS.getName()); + TableDefinition referencedTD = getTable(referencedSD, referencedT.getName()); + + addForeignKey: + if (referencedTD != null) { + for (Field fkField : fk.getFields()) + if (referencingTD.getColumn(fkField.getName()) == null) + break addForeignKey; + + for (Field fkField : fk.getFields()) + relations.addForeignKey( + fk.getName(), + referencingTD, + referencingTD.getColumn(fkField.getName()), + uk.getName(), + referencedTD + ); + } + } + } + } + } + } + } + } } @Override