diff --git a/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java b/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java index 887b1a26f9..e116bdb0e5 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java @@ -36,6 +36,7 @@ package org.jooq.util; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -46,15 +47,15 @@ import org.jooq.tools.JooqLogger; public class DefaultRelations implements Relations { - private static final JooqLogger log = JooqLogger.getLogger(DefaultRelations.class); + private static final JooqLogger log = JooqLogger.getLogger(DefaultRelations.class); - private Map primaryKeys = new LinkedHashMap(); - private Map uniqueKeys = new LinkedHashMap(); - private Map foreignKeys = new LinkedHashMap(); + private Map primaryKeys = new LinkedHashMap(); + private Map uniqueKeys = new LinkedHashMap(); + private Map foreignKeys = new LinkedHashMap(); - private Map primaryKeysByColumn = new LinkedHashMap(); - private Map> uniqueKeysByColumn = new LinkedHashMap>(); - private Map> foreignKeysByColumn = new LinkedHashMap>(); + private transient Map primaryKeysByColumn; + private transient Map> uniqueKeysByColumn; + private transient Map> foreignKeysByColumn; public void addPrimaryKey(String keyName, ColumnDefinition column) { if (log.isDebugEnabled()) { @@ -125,17 +126,14 @@ public class DefaultRelations implements Relations { @Override public UniqueKeyDefinition getPrimaryKey(ColumnDefinition column) { - if (!primaryKeysByColumn.containsKey(column)) { - UniqueKeyDefinition key = null; + if (primaryKeysByColumn == null) { + primaryKeysByColumn = new LinkedHashMap(); for (UniqueKeyDefinition primaryKey : primaryKeys.values()) { - if (primaryKey.getKeyColumns().contains(column)) { - key = primaryKey; - break; + for (ColumnDefinition keyColumn : primaryKey.getKeyColumns()) { + primaryKeysByColumn.put(keyColumn, primaryKey); } } - - primaryKeysByColumn.put(column, key); } return primaryKeysByColumn.get(column); @@ -143,19 +141,25 @@ public class DefaultRelations implements Relations { @Override public List getUniqueKeys(ColumnDefinition column) { - if (!uniqueKeysByColumn.containsKey(column)) { - List list = new ArrayList(); + if (uniqueKeysByColumn == null) { + uniqueKeysByColumn = new LinkedHashMap>(); + + for (UniqueKeyDefinition uniqueKey : uniqueKeys.values()) { + for (ColumnDefinition keyColumn : uniqueKey.getKeyColumns()) { + List list = uniqueKeysByColumn.get(keyColumn); + + if (list == null) { + list = new ArrayList(); + uniqueKeysByColumn.put(keyColumn, list); + } - for (UniqueKeyDefinition uniqueKey : uniqueKeys.values()) { - if (uniqueKey.getKeyColumns().contains(column)) { list.add(uniqueKey); } } - - uniqueKeysByColumn.put(column, list); } - return uniqueKeysByColumn.get(column); + List list = uniqueKeysByColumn.get(column); + return list != null ? list : Collections.emptyList(); } @Override @@ -171,19 +175,26 @@ public class DefaultRelations implements Relations { @Override public List getForeignKeys(ColumnDefinition column) { - if (!foreignKeysByColumn.containsKey(column)) { - List list = new ArrayList(); + if (foreignKeysByColumn == null) { + foreignKeysByColumn = new LinkedHashMap>(); for (ForeignKeyDefinition foreignKey : foreignKeys.values()) { - if (foreignKey.getKeyColumns().contains(column)) { + for (ColumnDefinition keyColumn : foreignKey.getKeyColumns()) { + List list = foreignKeysByColumn.get(keyColumn); + + if (list == null) { + list = new ArrayList(); + foreignKeysByColumn.put(keyColumn, list); + } + list.add(foreignKey); } } - - foreignKeysByColumn.put(column, list); } - return foreignKeysByColumn.get(column); + + List list = foreignKeysByColumn.get(column); + return list != null ? list : Collections.emptyList(); } @Override