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 d9a26d0d31..b8f2ae12ec 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java @@ -373,6 +373,7 @@ public class GenerationTool { database.setRecordTimestampFields(new String[] { defaultString(d.getRecordTimestampFields()) }); database.setSyntheticPrimaryKeys(new String[] { defaultString(d.getSyntheticPrimaryKeys()) }); database.setOverridePrimaryKeys(new String[] { defaultString(d.getOverridePrimaryKeys()) }); + database.setSyntheticIdentities(new String[] { defaultString(d.getSyntheticIdentities()) }); database.setConfiguredCustomTypes(d.getCustomTypes()); database.setConfiguredEnumTypes(d.getEnumTypes()); database.setConfiguredForcedTypes(d.getForcedTypes()); 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 60da6bc441..3edaac17e3 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java @@ -52,6 +52,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import static java.util.Collections.singletonList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; @@ -120,6 +121,7 @@ public abstract class AbstractDatabase implements Database { private String[] recordVersionFields; private String[] recordTimestampFields; private String[] syntheticPrimaryKeys; + private String[] syntheticIdentities; private String[] overridePrimaryKeys; private boolean supportsUnsignedTypes; private boolean ignoreProcedureReturnValues; @@ -688,6 +690,21 @@ public abstract class AbstractDatabase implements Database { return syntheticPrimaryKeys; } + @Override + public void setSyntheticIdentities(String[] syntheticIdentities) { + if (syntheticIdentities.length > 0 && !syntheticIdentities[0].isEmpty()) { + this.syntheticIdentities = syntheticIdentities; + } + } + + @Override + public final boolean isSyntheticIdentity(ColumnDefinition columnDefinition) { + if (syntheticIdentities == null) { + return false; + } + return !filterExcludeInclude(singletonList(columnDefinition), null, syntheticIdentities, filters).isEmpty(); + } + @Override public void setOverridePrimaryKeys(String[] overridePrimaryKeys) { this.overridePrimaryKeys = overridePrimaryKeys; diff --git a/jOOQ-meta/src/main/java/org/jooq/util/AbstractTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/AbstractTableDefinition.java index 9d590d447f..fc05ea5359 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractTableDefinition.java @@ -50,6 +50,7 @@ import java.util.List; import org.jooq.Record; import org.jooq.Table; +import org.jooq.tools.JooqLogger; /** * A base implementation for table definitions. @@ -60,6 +61,8 @@ public abstract class AbstractTableDefinition extends AbstractElementContainerDefinition implements TableDefinition { + private static final JooqLogger log = JooqLogger.getLogger(AbstractTableDefinition.class); + private List parameters; private TableDefinition parentTable; private List childTables; @@ -175,4 +178,18 @@ implements TableDefinition { protected List getParameters0() { return Collections.emptyList(); } + + protected ColumnDefinition applySyntheticIdentities(ColumnDefinition columnDefinition) { + if (!columnDefinition.isIdentity() && getDatabase().isSyntheticIdentity(columnDefinition)) { + log.info("Synthetic Identity: " + columnDefinition.getQualifiedName()); + return new DefaultColumnDefinition( + columnDefinition.getContainer(), + columnDefinition.getName(), + columnDefinition.getPosition(), + columnDefinition.getType(), + true, + columnDefinition.getComment()); + } + return columnDefinition; + } } 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 c967e1d9e4..a3b6da63bb 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/Database.java @@ -424,6 +424,18 @@ public interface Database { */ String[] getSyntheticPrimaryKeys(); + /** + * Columns matching these regular expressions will be considered as identity + * columns in generated code. + */ + void setSyntheticIdentities(String[] syntheticIdentityPattern); + + /** + * Returns true if the given column is considered a synthetic identity column + * as defined by the pattern(s) passed to setSyntheticIdentities [#5360] + */ + boolean isSyntheticIdentity(ColumnDefinition columnDefinition); + /** * Unique keys matching these regular expressions will be considered as * primary keys in generated code. diff --git a/jOOQ-meta/src/main/java/org/jooq/util/cubrid/CUBRIDTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/cubrid/CUBRIDTableDefinition.java index 7533c72955..ae95e5876d 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/cubrid/CUBRIDTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/cubrid/CUBRIDTableDefinition.java @@ -110,7 +110,7 @@ public class CUBRIDTableDefinition extends AbstractTableDefinition { null ); - result.add(column); + result.add(applySyntheticIdentities(column)); } return result; diff --git a/jOOQ-meta/src/main/java/org/jooq/util/derby/DerbyTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/derby/DerbyTableDefinition.java index c42d82960d..29c377f7e7 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/derby/DerbyTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/derby/DerbyTableDefinition.java @@ -110,7 +110,7 @@ public class DerbyTableDefinition extends AbstractTableDefinition { null ); - result.add(column); + result.add(applySyntheticIdentities(column)); } return result; diff --git a/jOOQ-meta/src/main/java/org/jooq/util/h2/H2TableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/h2/H2TableDefinition.java index 00f10a6846..668b633948 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/h2/H2TableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/h2/H2TableDefinition.java @@ -112,7 +112,7 @@ public class H2TableDefinition extends AbstractTableDefinition { || defaultString(record.get(Columns.COLUMN_DEFAULT)).trim().toLowerCase().startsWith("nextval"), record.get(Columns.REMARKS)); - result.add(column); + result.add(applySyntheticIdentities(column)); } return result; diff --git a/jOOQ-meta/src/main/java/org/jooq/util/hsqldb/HSQLDBTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/hsqldb/HSQLDBTableDefinition.java index c8f4a489a4..2c170c33c7 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/hsqldb/HSQLDBTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/hsqldb/HSQLDBTableDefinition.java @@ -118,7 +118,7 @@ public class HSQLDBTableDefinition extends AbstractTableDefinition { null ); - result.add(column); + result.add(applySyntheticIdentities(column)); } return result; diff --git a/jOOQ-meta/src/main/java/org/jooq/util/mysql/MySQLTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/mysql/MySQLTableDefinition.java index de1bb355d2..3a13e92227 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/mysql/MySQLTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/mysql/MySQLTableDefinition.java @@ -122,7 +122,7 @@ public class MySQLTableDefinition extends AbstractTableDefinition { record.get(Columns.COLUMN_COMMENT) ); - result.add(column); + result.add(applySyntheticIdentities(column)); } return result; diff --git a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresMaterializedViewDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresMaterializedViewDefinition.java index 9ab20c9e73..0dc98996db 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresMaterializedViewDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresMaterializedViewDefinition.java @@ -187,7 +187,7 @@ public class PostgresMaterializedViewDefinition extends AbstractTableDefinition record.get(PG_DESCRIPTION.DESCRIPTION) ); - result.add(column); + result.add(applySyntheticIdentities(column)); } return result; diff --git a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresTableDefinition.java index 1738c5f970..33d7b9f9c4 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresTableDefinition.java @@ -126,7 +126,7 @@ public class PostgresTableDefinition extends AbstractTableDefinition { record.get(PG_DESCRIPTION.DESCRIPTION) ); - result.add(column); + result.add(applySyntheticIdentities(column)); } return result; diff --git a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresTableValuedFunction.java b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresTableValuedFunction.java index e67692ea14..a3d90b5f66 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresTableValuedFunction.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/postgres/PostgresTableValuedFunction.java @@ -198,8 +198,8 @@ public class PostgresTableValuedFunction extends AbstractTableDefinition { null ); - result.add(column); - } + result.add(applySyntheticIdentities(column)); + } return result; } diff --git a/jOOQ-meta/src/main/java/org/jooq/util/sqlite/SQLiteTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/sqlite/SQLiteTableDefinition.java index 398ed0267e..f320f78362 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/sqlite/SQLiteTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/sqlite/SQLiteTableDefinition.java @@ -108,7 +108,7 @@ public class SQLiteTableDefinition extends AbstractTableDefinition { null ); - result.add(column); + result.add(applySyntheticIdentities(column)); } return result; diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.9.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.9.0.xsd index bc29af3f62..7ecdc7205a 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.9.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.9.0.xsd @@ -438,6 +438,12 @@ --> + + +