[#1380] [#3613] Generate equals(), hashCode() on POJOs:

- Renamed XSD property to indicate that this applies only to POJOs
- Correctly handle arrays in hashCode() calculations
This commit is contained in:
Lukas Eder 2014-09-02 17:56:57 +02:00
parent ff67579f2e
commit ccb0daadd7
5 changed files with 26 additions and 21 deletions

View File

@ -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;
}
// ----

View File

@ -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);

View File

@ -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

View File

@ -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;");

View File

@ -633,6 +633,11 @@
Generate POJOs for usage of the ResultQuery.fetchInto(Class) API
-->
<element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Generate basic equals() and hashCode() methods in POJOs
-->
<element name="pojosEqualsAndHashCode" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Generate immutable POJOs for usage of the ResultQuery.fetchInto(Class) API
@ -688,11 +693,6 @@
useful to those users who do not depend on EL, JSP, JSF, etc.
-->
<element name="fluentSetters" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
<!--
Generate basic equals() and hashCode() methods in POJOs
-->
<element name="generateEqualsAndHashCode" type="boolean" default="false" minOccurs="0" maxOccurs="1" />
</all>
</complexType>