[jOOQ/jOOQ#8705] Add code generation configuration to generate primary key based equals() and hashCode() on POJOs

This commit is contained in:
Lukas Eder 2024-10-23 10:22:59 +02:00
parent 4a88729447
commit 63b3051f7b
6 changed files with 96 additions and 10 deletions

View File

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

View File

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

View File

@ -1290,6 +1290,18 @@ public interface Generator {
*/
void setGeneratePojosEqualsAndHashCode(boolean generatePojosEqualsAndHashCode);
/**
* Whether the <code>equals()</code> and <code>hashCode()</code> methods be
* generated on POJOs should include primary key columns only.
*/
boolean generatePojosEqualsAndHashCodePrimaryKeyOnly();
/**
* Whether the <code>equals()</code> and <code>hashCode()</code> methods be
* generated on POJOs should include primary key columns only.
*/
void setGeneratePojosEqualsAndHashCodePrimaryKeyOnly(boolean generatePojosEqualsAndHashCodePrimaryKeyOnly);
/**
* A regular expression matching columns to include in <code>equals()</code>
* and <code>hashCode()</code> methods of generated POJOS.

View File

@ -6836,14 +6836,25 @@ public class JavaGenerator extends AbstractGenerator {
final String className = getStrategy().getJavaClassName(tableUdtOrEmbeddable, Mode.POJO);
List<Definition> 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) {

View File

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

View File

@ -2723,12 +2723,16 @@ jOOQ API, without adding custom data type bindings to them.]]></jxb:javadoc></jx
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate basic equals() and hashCode() methods in POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="pojosEqualsAndHashCodeIncludePrimaryKeyOnly" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Include primary key columns only in generated equals() and hashCode() methods in POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="pojosEqualsAndHashCodeColumnIncludeExpression" type="string" default="" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[A regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="pojosEqualsAndHashCodeColumnExcludeExpression" type="string" default="" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[A regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="pojosToString" type="boolean" default="true" minOccurs="0" maxOccurs="1">