diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java
index b87d68307e..bfd416a344 100644
--- a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java
+++ b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java
@@ -290,6 +290,7 @@ public class GenerationTool {
database.setIncludeExcludeColumns(TRUE.equals(d.isIncludeExcludeColumns()));
database.setRecordVersionFields(new String[] { defaultString(d.getRecordVersionFields()) });
database.setRecordTimestampFields(new String[] { defaultString(d.getRecordTimestampFields()) });
+ database.setOverridePrimaryKeys(new String[] { defaultString(d.getOverridePrimaryKeys()) });
database.setConfiguredCustomTypes(d.getCustomTypes());
database.setConfiguredEnumTypes(d.getEnumTypes());
database.setConfiguredForcedTypes(d.getForcedTypes());
diff --git a/jOOQ-meta/pom.xml b/jOOQ-meta/pom.xml
index da872fc3b5..72c7e6c5a0 100644
--- a/jOOQ-meta/pom.xml
+++ b/jOOQ-meta/pom.xml
@@ -48,7 +48,7 @@
src/main/resources/xsd
src/main/resources/xjb
- jooq-codegen-3.3.0.xsd
+ jooq-codegen-3.4.0.xsd
org.jooq.util.jaxb
diff --git a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java
index 6a0400a613..82feafcc79 100644
--- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java
+++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java
@@ -90,6 +90,7 @@ public abstract class AbstractDatabase implements Database {
private boolean includeExcludeColumns;
private String[] recordVersionFields;
private String[] recordTimestampFields;
+ private String[] overridePrimaryKeys;
private boolean supportsUnsignedTypes;
private boolean dateAsTimestamp;
private List configuredSchemata;
@@ -327,6 +328,16 @@ public abstract class AbstractDatabase implements Database {
return recordTimestampFields;
}
+ @Override
+ public void setOverridePrimaryKeys(String[] overridePrimaryKeys) {
+ this.overridePrimaryKeys = overridePrimaryKeys;
+ }
+
+ @Override
+ public String[] getOverridePrimaryKeys() {
+ return overridePrimaryKeys;
+ }
+
@Override
public final void setConfiguredEnumTypes(List configuredEnumTypes) {
this.configuredEnumTypes = configuredEnumTypes;
@@ -785,22 +796,26 @@ public abstract class AbstractDatabase implements Database {
List result = new ArrayList();
definitionsLoop: for (T definition : definitions) {
- for (String exclude : excludes) {
- if (exclude != null &&
- (definition.getName().matches(exclude.trim()) ||
- definition.getQualifiedName().matches(exclude.trim()))) {
+ if (excludes != null) {
+ for (String exclude : excludes) {
+ if (exclude != null &&
+ (definition.getName().matches(exclude.trim()) ||
+ definition.getQualifiedName().matches(exclude.trim()))) {
- continue definitionsLoop;
+ continue definitionsLoop;
+ }
}
}
- for (String include : includes) {
- if (include != null &&
- (definition.getName().matches(include.trim()) ||
- definition.getQualifiedName().matches(include.trim()))) {
+ if (includes != null) {
+ for (String include : includes) {
+ if (include != null &&
+ (definition.getName().matches(include.trim()) ||
+ definition.getQualifiedName().matches(include.trim()))) {
- result.add(definition);
- continue definitionsLoop;
+ result.add(definition);
+ continue definitionsLoop;
+ }
}
}
}
@@ -842,6 +857,13 @@ public abstract class AbstractDatabase implements Database {
log.error("Error while fetching check constraints", e);
}
+ try {
+ overridePrimaryKeys(result);
+ }
+ catch (Exception e) {
+ log.error("Error while overriding primary keys", e);
+ }
+
return result;
}
@@ -862,6 +884,17 @@ public abstract class AbstractDatabase implements Database {
return fetched.size() + " (" + included.size() + " included, " + (fetched.size() - included.size()) + " excluded)";
}
+ private final void overridePrimaryKeys(DefaultRelations r) {
+ List allKeys = r.getUniqueKeys();
+ List filteredKeys = filterExcludeInclude(allKeys, null, overridePrimaryKeys);
+
+ log.info("Overriding primary keys", fetchedSize(allKeys, filteredKeys));
+
+ for (UniqueKeyDefinition key : filteredKeys) {
+ r.overridePrimaryKey(key);
+ }
+ }
+
/**
* Create a new Factory
*/
diff --git a/jOOQ-meta/src/main/java/org/jooq/util/Database.java b/jOOQ-meta/src/main/java/org/jooq/util/Database.java
index be9ecfe3a4..c147ec326d 100644
--- a/jOOQ-meta/src/main/java/org/jooq/util/Database.java
+++ b/jOOQ-meta/src/main/java/org/jooq/util/Database.java
@@ -259,6 +259,18 @@ public interface Database {
*/
String[] getRecordTimestampFields();
+ /**
+ * Unique keys matching these regular expressions will be considered as
+ * primary keys in generated code.
+ */
+ void setOverridePrimaryKeys(String[] primaryKeys);
+
+ /**
+ * Unique keys matching these regular expressions will be considered as
+ * primary keys in generated code.
+ */
+ String[] getOverridePrimaryKeys();
+
/**
* Database objects matching any of these field names will be generated as
* custom types.
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 7b15a6efbc..6f71297398 100644
--- a/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java
+++ b/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java
@@ -42,10 +42,12 @@ package org.jooq.util;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import org.jooq.tools.JooqLogger;
@@ -98,6 +100,31 @@ public class DefaultRelations implements Relations {
key.getKeyColumns().add(column);
}
+ public void overridePrimaryKey(UniqueKeyDefinition key) {
+ UniqueKeyDefinition old = null;
+
+ // Remove the existing key from the column -> key mapping
+ primaryKeysByColumn = null;
+
+ // Remove the existing key from the key mapping
+ Iterator> it = primaryKeys.entrySet().iterator();
+ while (it.hasNext()) {
+ Entry entry = it.next();
+
+ if (entry.getValue().getTable().equals(key.getTable())) {
+ old = entry.getValue();
+ it.remove();
+ break;
+ }
+ }
+
+ // Add the new primary key
+ primaryKeys.put(key(key.getTable(), key.getName()), key);
+ log.info("Overriding primary key", "Table : " + key.getTable() +
+ ", previous key : " + ((old == null) ? "none" : old.getName()) +
+ ", new key : " + key.getName());
+ }
+
private UniqueKeyDefinition getUniqueKey(String keyName, ColumnDefinition column, boolean isPK) {
UniqueKeyDefinition key = uniqueKeys.get(key(column, keyName));
@@ -208,8 +235,6 @@ public class DefaultRelations implements Relations {
return new ArrayList(result);
}
-
-
@Override
public List getUniqueKeys(SchemaDefinition schema) {
Set result = new LinkedHashSet();
diff --git a/jOOQ-meta/src/main/resources/xjb/binding.xjb b/jOOQ-meta/src/main/resources/xjb/binding.xjb
index 5c81bd0390..9517d40c4d 100644
--- a/jOOQ-meta/src/main/resources/xjb/binding.xjb
+++ b/jOOQ-meta/src/main/resources/xjb/binding.xjb
@@ -11,7 +11,7 @@
-
+
@@ -19,7 +19,7 @@
-
+
diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.4.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.4.0.xsd
new file mode 100644
index 0000000000..7da4e84bdc
--- /dev/null
+++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.4.0.xsd
@@ -0,0 +1,632 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+