From ccb0daadd72d2bda39fe1fff8444d8aaf06054fe Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 2 Sep 2014 17:56:57 +0200 Subject: [PATCH] [#1380] [#3613] Generate equals(), hashCode() on POJOs: - Renamed XSD property to indicate that this applies only to POJOs - Correctly handle arrays in hashCode() calculations --- .../java/org/jooq/util/AbstractGenerator.java | 10 +++++----- .../main/java/org/jooq/util/GenerationTool.java | 4 ++-- .../src/main/java/org/jooq/util/Generator.java | 8 ++++---- .../main/java/org/jooq/util/JavaGenerator.java | 15 ++++++++++----- .../src/main/resources/xsd/jooq-codegen-3.5.0.xsd | 10 +++++----- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java index 50e444cff0..5820de9f6b 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/AbstractGenerator.java @@ -57,6 +57,7 @@ abstract class AbstractGenerator implements Generator { boolean useSchemaVersionProvider = false; boolean generateRecords = true; boolean generatePojos = false; + boolean generatePojosEqualsAndHashCode = false; boolean generateImmutablePojos = false; boolean generateInterfaces = false; boolean generateDaos = false; @@ -64,7 +65,6 @@ abstract class AbstractGenerator implements Generator { boolean generateValidationAnnotations = false; boolean generateGlobalObjectReferences = true; boolean fluentSetters = false; - boolean generateEqualsAndHashCode = false; protected GeneratorStrategyWrapper strategy; @@ -228,13 +228,13 @@ abstract class AbstractGenerator implements Generator { } @Override - public boolean generateEqualsAndHashCode() { - return generateEqualsAndHashCode; + public boolean generatePojosEqualsAndHashCode() { + return generatePojosEqualsAndHashCode; } @Override - public void setGenerateEqualsAndHashCode(boolean generateEqualsAndHashCode) { - this.generateEqualsAndHashCode = generateEqualsAndHashCode; + public void setGeneratePojosEqualsAndHashCode(boolean generatePojosEqualsAndHashCode) { + this.generatePojosEqualsAndHashCode = generatePojosEqualsAndHashCode; } // ---- 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 6fc34f1ab9..122e09755a 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java @@ -397,8 +397,8 @@ public class GenerationTool { generator.setGenerateGlobalObjectReferences(g.getGenerate().isGlobalObjectReferences()); if (g.getGenerate().isFluentSetters() != null) generator.setFluentSetters(g.getGenerate().isFluentSetters()); - if (g.getGenerate().isGenerateEqualsAndHashCode() != null) - generator.setGenerateEqualsAndHashCode(g.getGenerate().isGenerateEqualsAndHashCode()); + if (g.getGenerate().isPojosEqualsAndHashCode() != null) + generator.setGeneratePojosEqualsAndHashCode(g.getGenerate().isPojosEqualsAndHashCode()); if (!StringUtils.isBlank(g.getDatabase().getSchemaVersionProvider())) generator.setUseSchemaVersionProvider(true); diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java index 49f38c7d0e..a4973b0090 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/Generator.java @@ -203,14 +203,14 @@ public interface Generator { void setFluentSetters(boolean fluentSetters); /** - * Whether equals and hashCode methods should be generated + * Whether equals and hashCode methods should be generated on POJOs */ - boolean generateEqualsAndHashCode(); + boolean generatePojosEqualsAndHashCode(); /** - * Whether equals and hashCode methods should be generated + * Whether equals and hashCode methods should be generated on POJOs */ - void setGenerateEqualsAndHashCode(boolean generateEqualsAndHashCode); + void setGeneratePojosEqualsAndHashCode(boolean generatePojosEqualsAndHashCode); /** * The target directory diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java index 01b9257a2d..829f5244e1 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java @@ -1895,7 +1895,7 @@ public class JavaGenerator extends AbstractGenerator { } // equals - if (generateEqualsAndHashCode()) { + if (generatePojosEqualsAndHashCode()) { out.println(); out.tab(1).println("@Override"); out.tab(1).println("public boolean equals(Object obj) {"); @@ -1918,7 +1918,8 @@ public class JavaGenerator extends AbstractGenerator { if (getJavaType(column.getType()).endsWith("[]")) { out.tab(2).println("else if (!java.util.Arrays.equals(%s, other.%s))", columnMember, columnMember); - } else { + } + else { out.tab(2).println("else if (!%s.equals(other.%s))", columnMember, columnMember); } @@ -1930,7 +1931,7 @@ public class JavaGenerator extends AbstractGenerator { } // hashCode - if (generateEqualsAndHashCode()) { + if (generatePojosEqualsAndHashCode()) { out.println(); out.tab(1).println("@Override"); out.tab(1).println("public int hashCode() {"); @@ -1940,8 +1941,12 @@ public class JavaGenerator extends AbstractGenerator { for (TypedElementDefinition column : getTypedElements(tableOrUDT)) { final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO); - out.tab(2).println("result = prime * result + ((%s == null) ? 0 : %s.hashCode());", - columnMember, columnMember); + if (getJavaType(column.getType()).endsWith("[]")) { + out.tab(2).println("result = prime * result + ((%s == null) ? 0 : java.util.Arrays.hashCode(%s));", columnMember, columnMember); + } + else { + out.tab(2).println("result = prime * result + ((%s == null) ? 0 : %s.hashCode());", columnMember, columnMember); + } } out.tab(2).println("return result;"); diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.5.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.5.0.xsd index ce8a3ace6d..cebb936d83 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.5.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.5.0.xsd @@ -633,6 +633,11 @@ Generate POJOs for usage of the ResultQuery.fetchInto(Class) API --> + + + - - -