diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java index 418cf0a104..289aeb69fb 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -112,6 +112,7 @@ abstract class AbstractGenerator implements Generator { boolean generatePojosAsScalaCaseClasses = true; boolean generatePojosAsKotlinDataClasses = true; boolean generatePojosEqualsAndHashCode = true; + boolean generatePojosEqualsAndHashCodePrimaryKeyOnly = false; String generatePojosEqualsAndHashCodeColumnIncludeExpression = null; String generatePojosEqualsAndHashCodeColumnExcludeExpression = null; boolean generatePojosToString = true; @@ -1401,6 +1402,16 @@ abstract class AbstractGenerator implements Generator { this.generatePojosEqualsAndHashCode = generatePojosEqualsAndHashCode; } + @Override + public boolean generatePojosEqualsAndHashCodePrimaryKeyOnly() { + return generatePojosEqualsAndHashCodePrimaryKeyOnly; + } + + @Override + public void setGeneratePojosEqualsAndHashCodePrimaryKeyOnly(boolean generatePojosEqualsAndHashCodePrimaryKeyOnly) { + this.generatePojosEqualsAndHashCodePrimaryKeyOnly = generatePojosEqualsAndHashCodePrimaryKeyOnly; + } + @Override public String generatePojosEqualsAndHashCodeColumnIncludeExpression() { return generatePojosEqualsAndHashCodeColumnIncludeExpression; diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java index d1b235ad1f..5b41a7c85c 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -954,6 +954,8 @@ public class GenerationTool { generator.setGenerateVarargsSetters(g.getGenerate().isVarargSetters()); if (g.getGenerate().isPojosEqualsAndHashCode() != null) generator.setGeneratePojosEqualsAndHashCode(g.getGenerate().isPojosEqualsAndHashCode()); + if (g.getGenerate().isPojosEqualsAndHashCodeIncludePrimaryKeyOnly() != null) + generator.setGeneratePojosEqualsAndHashCodePrimaryKeyOnly(g.getGenerate().isPojosEqualsAndHashCodeIncludePrimaryKeyOnly()); if (g.getGenerate().getPojosEqualsAndHashCodeColumnIncludeExpression() != null) generator.setGeneratePojosEqualsAndHashCodeColumnIncludeExpression(g.getGenerate().getPojosEqualsAndHashCodeColumnIncludeExpression()); if (g.getGenerate().getPojosEqualsAndHashCodeColumnExcludeExpression() != null) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java index f22277d0a8..5a1ea73b1c 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -1290,6 +1290,18 @@ public interface Generator { */ void setGeneratePojosEqualsAndHashCode(boolean generatePojosEqualsAndHashCode); + /** + * Whether the equals() and hashCode() methods be + * generated on POJOs should include primary key columns only. + */ + boolean generatePojosEqualsAndHashCodePrimaryKeyOnly(); + + /** + * Whether the equals() and hashCode() methods be + * generated on POJOs should include primary key columns only. + */ + void setGeneratePojosEqualsAndHashCodePrimaryKeyOnly(boolean generatePojosEqualsAndHashCodePrimaryKeyOnly); + /** * A regular expression matching columns to include in equals() * and hashCode() methods of generated POJOS. diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index db2edbd831..8105d45612 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -6836,14 +6836,25 @@ public class JavaGenerator extends AbstractGenerator { final String className = getStrategy().getJavaClassName(tableUdtOrEmbeddable, Mode.POJO); List replacingEmbeddablesAndUnreplacedColumns = replacingEmbeddablesAndUnreplacedColumns(tableUdtOrEmbeddable); - if (generatePojosEqualsAndHashCodeColumnIncludeExpression() != null || - generatePojosEqualsAndHashCodeColumnExcludeExpression() != null) + // [#17487] Include / exclude specific columns, if requested + if (!isEmpty(generatePojosEqualsAndHashCodeColumnIncludeExpression()) || + !isEmpty(generatePojosEqualsAndHashCodeColumnExcludeExpression())) replacingEmbeddablesAndUnreplacedColumns = database.filterExcludeInclude( replacingEmbeddablesAndUnreplacedColumns, generatePojosEqualsAndHashCodeColumnExcludeExpression(), generatePojosEqualsAndHashCodeColumnIncludeExpression() ); + // [#8705] Retain only primary key columns, if requested + if (generatePojosEqualsAndHashCodePrimaryKeyOnly()) { + if (tableUdtOrEmbeddable instanceof TableDefinition t) { + UniqueKeyDefinition pk = t.getPrimaryKey(); + + if (pk != null) + replacingEmbeddablesAndUnreplacedColumns.retainAll(pk.getKeyColumns()); + } + } + out.println(); if (scala) { diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java index 6900912a93..12489e49f1 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java @@ -116,6 +116,8 @@ public class Generate implements Serializable, XMLAppendable protected Boolean pojos = false; @XmlElement(defaultValue = "true") protected Boolean pojosEqualsAndHashCode = true; + @XmlElement(defaultValue = "true") + protected Boolean pojosEqualsAndHashCodeIncludePrimaryKeyOnly = true; @XmlElement(defaultValue = "") @XmlJavaTypeAdapter(StringAdapter.class) protected String pojosEqualsAndHashCodeColumnIncludeExpression = ""; @@ -1298,7 +1300,31 @@ public class Generate implements Serializable, XMLAppendable } /** - * The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs. + * Include primary key columns only in generated equals() and hashCode() methods in POJOs. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isPojosEqualsAndHashCodeIncludePrimaryKeyOnly() { + return pojosEqualsAndHashCodeIncludePrimaryKeyOnly; + } + + /** + * Include primary key columns only in generated equals() and hashCode() methods in POJOs. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setPojosEqualsAndHashCodeIncludePrimaryKeyOnly(Boolean value) { + this.pojosEqualsAndHashCodeIncludePrimaryKeyOnly = value; + } + + /** + * A regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs. * */ public String getPojosEqualsAndHashCodeColumnIncludeExpression() { @@ -1306,7 +1332,7 @@ public class Generate implements Serializable, XMLAppendable } /** - * The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs. + * A regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs. * */ public void setPojosEqualsAndHashCodeColumnIncludeExpression(String value) { @@ -1314,7 +1340,7 @@ public class Generate implements Serializable, XMLAppendable } /** - * The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs. + * A regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs. * */ public String getPojosEqualsAndHashCodeColumnExcludeExpression() { @@ -1322,7 +1348,7 @@ public class Generate implements Serializable, XMLAppendable } /** - * The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs. + * A regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs. * */ public void setPojosEqualsAndHashCodeColumnExcludeExpression(String value) { @@ -3689,7 +3715,16 @@ public class Generate implements Serializable, XMLAppendable } /** - * The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs. + * Include primary key columns only in generated equals() and hashCode() methods in POJOs. + * + */ + public Generate withPojosEqualsAndHashCodeIncludePrimaryKeyOnly(Boolean value) { + setPojosEqualsAndHashCodeIncludePrimaryKeyOnly(value); + return this; + } + + /** + * A regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs. * */ public Generate withPojosEqualsAndHashCodeColumnIncludeExpression(String value) { @@ -3698,7 +3733,7 @@ public class Generate implements Serializable, XMLAppendable } /** - * The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs. + * A regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs. * */ public Generate withPojosEqualsAndHashCodeColumnExcludeExpression(String value) { @@ -4520,6 +4555,7 @@ public class Generate implements Serializable, XMLAppendable builder.append("enumsAsScalaEnums", enumsAsScalaEnums); builder.append("pojos", pojos); builder.append("pojosEqualsAndHashCode", pojosEqualsAndHashCode); + builder.append("pojosEqualsAndHashCodeIncludePrimaryKeyOnly", pojosEqualsAndHashCodeIncludePrimaryKeyOnly); builder.append("pojosEqualsAndHashCodeColumnIncludeExpression", pojosEqualsAndHashCodeColumnIncludeExpression); builder.append("pojosEqualsAndHashCodeColumnExcludeExpression", pojosEqualsAndHashCodeColumnExcludeExpression); builder.append("pojosToString", pojosToString); @@ -5003,6 +5039,15 @@ public class Generate implements Serializable, XMLAppendable return false; } } + if (pojosEqualsAndHashCodeIncludePrimaryKeyOnly == null) { + if (other.pojosEqualsAndHashCodeIncludePrimaryKeyOnly!= null) { + return false; + } + } else { + if (!pojosEqualsAndHashCodeIncludePrimaryKeyOnly.equals(other.pojosEqualsAndHashCodeIncludePrimaryKeyOnly)) { + return false; + } + } if (pojosEqualsAndHashCodeColumnIncludeExpression == null) { if (other.pojosEqualsAndHashCodeColumnIncludeExpression!= null) { return false; @@ -5808,6 +5853,7 @@ public class Generate implements Serializable, XMLAppendable result = ((prime*result)+((enumsAsScalaEnums == null)? 0 :enumsAsScalaEnums.hashCode())); result = ((prime*result)+((pojos == null)? 0 :pojos.hashCode())); result = ((prime*result)+((pojosEqualsAndHashCode == null)? 0 :pojosEqualsAndHashCode.hashCode())); + result = ((prime*result)+((pojosEqualsAndHashCodeIncludePrimaryKeyOnly == null)? 0 :pojosEqualsAndHashCodeIncludePrimaryKeyOnly.hashCode())); result = ((prime*result)+((pojosEqualsAndHashCodeColumnIncludeExpression == null)? 0 :pojosEqualsAndHashCodeColumnIncludeExpression.hashCode())); result = ((prime*result)+((pojosEqualsAndHashCodeColumnExcludeExpression == null)? 0 :pojosEqualsAndHashCodeColumnExcludeExpression.hashCode())); result = ((prime*result)+((pojosToString == null)? 0 :pojosToString.hashCode())); diff --git a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd index 71830b850e..20aff6c4da 100644 --- a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd +++ b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd @@ -2723,12 +2723,16 @@ jOOQ API, without adding custom data type bindings to them.]]> + + + + - + - +