[jOOQ/jOOQ#17487] Add code generation configuration flags to specify

which columns to include / exclude in generated POJO equals() and
hashCode() implementations
This commit is contained in:
Lukas Eder 2024-10-22 16:59:21 +02:00
parent 0c6d699301
commit 4a88729447
7 changed files with 269 additions and 120 deletions

View File

@ -65,140 +65,142 @@ import org.jooq.tools.JooqLogger;
*/
abstract class AbstractGenerator implements Generator {
private static final JooqLogger log = JooqLogger.getLogger(AbstractGenerator.class);
private static final JooqLogger log = JooqLogger.getLogger(AbstractGenerator.class);
boolean generateDeprecated = true;
boolean generateDeprecationOnUnknownTypes = true;
boolean generateIndexes = true;
boolean generateRelations = true;
boolean generateUDTPaths = true;
boolean generateImplicitJoinPathsToOne = true;
boolean generateImplicitJoinPathsToMany = true;
boolean generateImplicitJoinPathTableSubtypes = true;
boolean generateImplicitJoinPathUnusedConstructors = true;
boolean generateImplicitJoinPathsAsKotlinProperties = true;
boolean generateInstanceFields = true;
VisibilityModifier generateVisibilityModifier = VisibilityModifier.DEFAULT;
boolean generateGeneratedAnnotation = false;
GeneratedAnnotationType generatedGeneratedAnnotationType = GeneratedAnnotationType.DETECT_FROM_JDK;
boolean generateGeneratedAnnotationDate = false;
boolean generateGeneratedAnnotationJooqVersion = true;
boolean generateNonnullAnnotation = false;
String generatedNonnullAnnotationType = "javax.annotation.Nonnull";
boolean generateNullableAnnotation = false;
boolean generateNullableAnnotationOnWriteOnlyNullableTypes = false;
String generatedNullableAnnotationType = "javax.annotation.Nullable";
boolean generateConstructorPropertiesAnnotation = false;
boolean generateDeprecated = true;
boolean generateDeprecationOnUnknownTypes = true;
boolean generateIndexes = true;
boolean generateRelations = true;
boolean generateUDTPaths = true;
boolean generateImplicitJoinPathsToOne = true;
boolean generateImplicitJoinPathsToMany = true;
boolean generateImplicitJoinPathTableSubtypes = true;
boolean generateImplicitJoinPathUnusedConstructors = true;
boolean generateImplicitJoinPathsAsKotlinProperties = true;
boolean generateInstanceFields = true;
VisibilityModifier generateVisibilityModifier = VisibilityModifier.DEFAULT;
boolean generateGeneratedAnnotation = false;
GeneratedAnnotationType generatedGeneratedAnnotationType = GeneratedAnnotationType.DETECT_FROM_JDK;
boolean generateGeneratedAnnotationDate = false;
boolean generateGeneratedAnnotationJooqVersion = true;
boolean generateNonnullAnnotation = false;
String generatedNonnullAnnotationType = "javax.annotation.Nonnull";
boolean generateNullableAnnotation = false;
boolean generateNullableAnnotationOnWriteOnlyNullableTypes = false;
String generatedNullableAnnotationType = "javax.annotation.Nullable";
boolean generateConstructorPropertiesAnnotation = false;
Boolean generateConstructorPropertiesAnnotationOnPojos;
Boolean generateConstructorPropertiesAnnotationOnRecords;
boolean useSchemaVersionProvider = false;
boolean useCatalogVersionProvider = false;
boolean generateRoutines = true;
boolean useSchemaVersionProvider = false;
boolean useCatalogVersionProvider = false;
boolean generateRoutines = true;
boolean generateSequences = true;
boolean generateSequenceFlags = true;
boolean generateUDTs = true;
boolean generateTables = true;
boolean generateEmbeddables = true;
boolean generateRecords = true;
boolean generateRecordsImplementingRecordN = false;
boolean generateEnumsAsScalaSealedTraits = false;
boolean generateEnumsAsScalaEnums = true;
boolean generatePojos = false;
boolean generatePojosAsJavaRecordClasses = false;
boolean generatePojosAsScalaCaseClasses = true;
boolean generatePojosAsKotlinDataClasses = true;
boolean generatePojosEqualsAndHashCode = true;
boolean generatePojosToString = true;
boolean generateImmutablePojos = false;
boolean generateSerializablePojos = true;
boolean generateInterfaces = false;
boolean generateImmutableInterfaces = false;
boolean generateSerializableInterfaces = true;
boolean generateDaos = false;
boolean generateJooqVersionReference = true;
boolean generateJPAAnnotations = false;
String generateJPAVersion = "";
boolean generateValidationAnnotations = false;
boolean generateSpringAnnotations = false;
boolean generateSpringDao = false;
boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix = true;
boolean generateKotlinNotNullPojoAttributes = false;
boolean generateKotlinNotNullRecordAttributes = false;
boolean generateKotlinNotNullInterfaceAttributes = false;
boolean generateKotlinDefaultedNullablePojoAttributes = true;
boolean generateKotlinDefaultedNullableRecordAttributes = true;
GeneratedSerialVersionUID generatedSerialVersionUID = GeneratedSerialVersionUID.CONSTANT;
int maxMembersPerInitialiser = 500;
boolean generateQueues = true;
boolean generateLinks = true;
boolean generateKeys = true;
boolean generateGlobalObjectNames = true;
boolean generateGlobalObjectReferences = true;
boolean generateGlobalCatalogReferences = true;
boolean generateGlobalSchemaReferences = true;
boolean generateGlobalRoutineReferences = true;
boolean generateGlobalSequenceReferences = true;
boolean generateGlobalTableReferences = true;
boolean generateGlobalDomainReferences = true;
boolean generateSequences = true;
boolean generateSequenceFlags = true;
boolean generateUDTs = true;
boolean generateTables = true;
boolean generateEmbeddables = true;
boolean generateRecords = true;
boolean generateRecordsImplementingRecordN = false;
boolean generateEnumsAsScalaSealedTraits = false;
boolean generateEnumsAsScalaEnums = true;
boolean generatePojos = false;
boolean generatePojosAsJavaRecordClasses = false;
boolean generatePojosAsScalaCaseClasses = true;
boolean generatePojosAsKotlinDataClasses = true;
boolean generatePojosEqualsAndHashCode = true;
String generatePojosEqualsAndHashCodeColumnIncludeExpression = null;
String generatePojosEqualsAndHashCodeColumnExcludeExpression = null;
boolean generatePojosToString = true;
boolean generateImmutablePojos = false;
boolean generateSerializablePojos = true;
boolean generateInterfaces = false;
boolean generateImmutableInterfaces = false;
boolean generateSerializableInterfaces = true;
boolean generateDaos = false;
boolean generateJooqVersionReference = true;
boolean generateJPAAnnotations = false;
String generateJPAVersion = "";
boolean generateValidationAnnotations = false;
boolean generateSpringAnnotations = false;
boolean generateSpringDao = false;
boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix = true;
boolean generateKotlinNotNullPojoAttributes = false;
boolean generateKotlinNotNullRecordAttributes = false;
boolean generateKotlinNotNullInterfaceAttributes = false;
boolean generateKotlinDefaultedNullablePojoAttributes = true;
boolean generateKotlinDefaultedNullableRecordAttributes = true;
GeneratedSerialVersionUID generatedSerialVersionUID = GeneratedSerialVersionUID.CONSTANT;
int maxMembersPerInitialiser = 500;
boolean generateQueues = true;
boolean generateLinks = true;
boolean generateKeys = true;
boolean generateGlobalObjectNames = true;
boolean generateGlobalObjectReferences = true;
boolean generateGlobalCatalogReferences = true;
boolean generateGlobalSchemaReferences = true;
boolean generateGlobalRoutineReferences = true;
boolean generateGlobalSequenceReferences = true;
boolean generateGlobalTableReferences = true;
boolean generateGlobalDomainReferences = true;
boolean generateGlobalUDTReferences = true;
boolean generateGlobalQueueReferences = true;
boolean generateGlobalLinkReferences = true;
boolean generateGlobalKeyReferences = true;
boolean generateGlobalIndexReferences = true;
boolean generateDefaultCatalog = true;
boolean generateDefaultSchema = true;
boolean generateJavadoc = true;
boolean generateComments = true;
boolean generateCommentsOnAttributes = true;
boolean generateCommentsOnCatalogs = true;
boolean generateCommentsOnColumns = true;
boolean generateCommentsOnKeys = true;
boolean generateCommentsOnLinks = true;
boolean generateCommentsOnPackages = true;
boolean generateCommentsOnParameters = true;
boolean generateCommentsOnQueues = true;
boolean generateCommentsOnRoutines = true;
boolean generateCommentsOnSchemas = true;
boolean generateCommentsOnSequences = true;
boolean generateCommentsOnDomains = true;
boolean generateCommentsOnTables = true;
boolean generateCommentsOnUDTs = true;
boolean generateCommentsOnEmbeddables = true;
boolean generateSources = true;
boolean generateSourcesOnViews = true;
boolean generateFluentSetters = false;
boolean generateJavaBeansGettersAndSetters = false;
boolean generateUseTableNameForUnambiguousFKs = true;
boolean generateVarargsSetters = true;
String generateFullyQualifiedTypes = "";
boolean generateJavaTimeTypes = true;
boolean generateSpatialTypes = true;
boolean generateXmlTypes = true;
boolean generateJsonTypes = true;
boolean generateIntervalTypes = true;
boolean generateDecfloatTypes = true;
boolean generateTableValuedFunctions = false;
boolean generateEmptyCatalogs = false;
boolean generateEmptySchemas = false;
String generateNewline = "\n";
boolean generateGlobalUDTReferences = true;
boolean generateGlobalQueueReferences = true;
boolean generateGlobalLinkReferences = true;
boolean generateGlobalKeyReferences = true;
boolean generateGlobalIndexReferences = true;
boolean generateDefaultCatalog = true;
boolean generateDefaultSchema = true;
boolean generateJavadoc = true;
boolean generateComments = true;
boolean generateCommentsOnAttributes = true;
boolean generateCommentsOnCatalogs = true;
boolean generateCommentsOnColumns = true;
boolean generateCommentsOnKeys = true;
boolean generateCommentsOnLinks = true;
boolean generateCommentsOnPackages = true;
boolean generateCommentsOnParameters = true;
boolean generateCommentsOnQueues = true;
boolean generateCommentsOnRoutines = true;
boolean generateCommentsOnSchemas = true;
boolean generateCommentsOnSequences = true;
boolean generateCommentsOnDomains = true;
boolean generateCommentsOnTables = true;
boolean generateCommentsOnUDTs = true;
boolean generateCommentsOnEmbeddables = true;
boolean generateSources = true;
boolean generateSourcesOnViews = true;
boolean generateFluentSetters = false;
boolean generateJavaBeansGettersAndSetters = false;
boolean generateUseTableNameForUnambiguousFKs = true;
boolean generateVarargsSetters = true;
String generateFullyQualifiedTypes = "";
boolean generateJavaTimeTypes = true;
boolean generateSpatialTypes = true;
boolean generateXmlTypes = true;
boolean generateJsonTypes = true;
boolean generateIntervalTypes = true;
boolean generateDecfloatTypes = true;
boolean generateTableValuedFunctions = false;
boolean generateEmptyCatalogs = false;
boolean generateEmptySchemas = false;
String generateNewline = "\n";
String generateIndentation;
int generatePrintMarginForBlockComment = 80;
GeneratedTextBlocks generateTextBlocks = GeneratedTextBlocks.DETECT_FROM_JDK;
boolean generateWhereMethodOverrides = true;
boolean generateRenameMethodOverrides = true;
boolean generateAsMethodOverrides = true;
int generatePrintMarginForBlockComment = 80;
GeneratedTextBlocks generateTextBlocks = GeneratedTextBlocks.DETECT_FROM_JDK;
boolean generateWhereMethodOverrides = true;
boolean generateRenameMethodOverrides = true;
boolean generateAsMethodOverrides = true;
protected GeneratorStrategyWrapper strategy;
protected String targetEncoding = "UTF-8";
protected boolean targetClean = true;
protected String targetEncoding = "UTF-8";
protected boolean targetClean = true;
final Language languageConfigured;
Language language;
Database database;
@ -1399,6 +1401,26 @@ abstract class AbstractGenerator implements Generator {
this.generatePojosEqualsAndHashCode = generatePojosEqualsAndHashCode;
}
@Override
public String generatePojosEqualsAndHashCodeColumnIncludeExpression() {
return generatePojosEqualsAndHashCodeColumnIncludeExpression;
}
@Override
public void setGeneratePojosEqualsAndHashCodeColumnIncludeExpression(String generatePojosEqualsAndHashCodeColumnIncludeExpression) {
this.generatePojosEqualsAndHashCodeColumnIncludeExpression = generatePojosEqualsAndHashCodeColumnIncludeExpression;
}
@Override
public String generatePojosEqualsAndHashCodeColumnExcludeExpression() {
return generatePojosEqualsAndHashCodeColumnExcludeExpression;
}
@Override
public void setGeneratePojosEqualsAndHashCodeColumnExcludeExpression(String generatePojosEqualsAndHashCodeColumnExcludeExpression) {
this.generatePojosEqualsAndHashCodeColumnExcludeExpression = generatePojosEqualsAndHashCodeColumnExcludeExpression;
}
@Override
public boolean generatePojosToString() {
return generatePojosToString;

View File

@ -954,6 +954,10 @@ public class GenerationTool {
generator.setGenerateVarargsSetters(g.getGenerate().isVarargSetters());
if (g.getGenerate().isPojosEqualsAndHashCode() != null)
generator.setGeneratePojosEqualsAndHashCode(g.getGenerate().isPojosEqualsAndHashCode());
if (g.getGenerate().getPojosEqualsAndHashCodeColumnIncludeExpression() != null)
generator.setGeneratePojosEqualsAndHashCodeColumnIncludeExpression(g.getGenerate().getPojosEqualsAndHashCodeColumnIncludeExpression());
if (g.getGenerate().getPojosEqualsAndHashCodeColumnExcludeExpression() != null)
generator.setGeneratePojosEqualsAndHashCodeColumnExcludeExpression(g.getGenerate().getPojosEqualsAndHashCodeColumnExcludeExpression());
if (g.getGenerate().isPojosToString() != null)
generator.setGeneratePojosToString(g.getGenerate().isPojosToString());
if (g.getGenerate().getFullyQualifiedTypes() != null)

View File

@ -1290,6 +1290,30 @@ public interface Generator {
*/
void setGeneratePojosEqualsAndHashCode(boolean generatePojosEqualsAndHashCode);
/**
* A regular expression matching columns to include in <code>equals()</code>
* and <code>hashCode()</code> methods of generated POJOS.
*/
String generatePojosEqualsAndHashCodeColumnIncludeExpression();
/**
* A regular expression matching columns to include in <code>equals()</code>
* and <code>hashCode()</code> methods of generated POJOS.
*/
void setGeneratePojosEqualsAndHashCodeColumnIncludeExpression(String generatePojosEqualsAndHashCodeColumnIncludeExpression);
/**
* A regular expression matching columns to exclude in <code>equals()</code>
* and <code>hashCode()</code> methods of generated POJOS.
*/
String generatePojosEqualsAndHashCodeColumnExcludeExpression();
/**
* A regular expression matching columns to exclude in <code>equals()</code>
* and <code>hashCode()</code> methods of generated POJOS.
*/
void setGeneratePojosEqualsAndHashCodeColumnExcludeExpression(String generatePojosEqualsAndHashCodeColumnExcludeExpression);
/**
* Whether a <code>toString()</code> method should be generated on POJOs
*/

View File

@ -6836,6 +6836,14 @@ public class JavaGenerator extends AbstractGenerator {
final String className = getStrategy().getJavaClassName(tableUdtOrEmbeddable, Mode.POJO);
List<Definition> replacingEmbeddablesAndUnreplacedColumns = replacingEmbeddablesAndUnreplacedColumns(tableUdtOrEmbeddable);
if (generatePojosEqualsAndHashCodeColumnIncludeExpression() != null ||
generatePojosEqualsAndHashCodeColumnExcludeExpression() != null)
replacingEmbeddablesAndUnreplacedColumns = database.filterExcludeInclude(
replacingEmbeddablesAndUnreplacedColumns,
generatePojosEqualsAndHashCodeColumnExcludeExpression(),
generatePojosEqualsAndHashCodeColumnIncludeExpression()
);
out.println();
if (scala) {

View File

@ -969,6 +969,11 @@ public interface Database extends AutoCloseable {
*/
<D extends Definition> List<D> filterExcludeInclude(List<D> definitions);
/**
* Filter a list of definitions according to the exclude / include expressions passed as arguments.
*/
<D extends Definition> List<D> filterExcludeInclude(List<D> definitions, String exclude, String include);
/**
* Sort a list of definitions according to the {@link #getOrderProvider()} defined in this database.
*/

View File

@ -116,6 +116,12 @@ public class Generate implements Serializable, XMLAppendable
protected Boolean pojos = false;
@XmlElement(defaultValue = "true")
protected Boolean pojosEqualsAndHashCode = true;
@XmlElement(defaultValue = "")
@XmlJavaTypeAdapter(StringAdapter.class)
protected String pojosEqualsAndHashCodeColumnIncludeExpression = "";
@XmlElement(defaultValue = "")
@XmlJavaTypeAdapter(StringAdapter.class)
protected String pojosEqualsAndHashCodeColumnExcludeExpression = "";
@XmlElement(defaultValue = "true")
protected Boolean pojosToString = true;
@XmlElement(defaultValue = "false")
@ -1291,6 +1297,38 @@ public class Generate implements Serializable, XMLAppendable
this.pojosEqualsAndHashCode = value;
}
/**
* The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs.
*
*/
public String getPojosEqualsAndHashCodeColumnIncludeExpression() {
return pojosEqualsAndHashCodeColumnIncludeExpression;
}
/**
* The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs.
*
*/
public void setPojosEqualsAndHashCodeColumnIncludeExpression(String value) {
this.pojosEqualsAndHashCodeColumnIncludeExpression = value;
}
/**
* The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs.
*
*/
public String getPojosEqualsAndHashCodeColumnExcludeExpression() {
return pojosEqualsAndHashCodeColumnExcludeExpression;
}
/**
* The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs.
*
*/
public void setPojosEqualsAndHashCodeColumnExcludeExpression(String value) {
this.pojosEqualsAndHashCodeColumnExcludeExpression = value;
}
/**
* Generate basic toString() methods in POJOs.
*
@ -3650,6 +3688,24 @@ public class Generate implements Serializable, XMLAppendable
return this;
}
/**
* The regular expression matching columns for inclusion in generated equals() and hashCode() methods in POJOs.
*
*/
public Generate withPojosEqualsAndHashCodeColumnIncludeExpression(String value) {
setPojosEqualsAndHashCodeColumnIncludeExpression(value);
return this;
}
/**
* The regular expression matching columns for exclusion in generated equals() and hashCode() methods in POJOs.
*
*/
public Generate withPojosEqualsAndHashCodeColumnExcludeExpression(String value) {
setPojosEqualsAndHashCodeColumnExcludeExpression(value);
return this;
}
/**
* Generate basic toString() methods in POJOs.
*
@ -4464,6 +4520,8 @@ public class Generate implements Serializable, XMLAppendable
builder.append("enumsAsScalaEnums", enumsAsScalaEnums);
builder.append("pojos", pojos);
builder.append("pojosEqualsAndHashCode", pojosEqualsAndHashCode);
builder.append("pojosEqualsAndHashCodeColumnIncludeExpression", pojosEqualsAndHashCodeColumnIncludeExpression);
builder.append("pojosEqualsAndHashCodeColumnExcludeExpression", pojosEqualsAndHashCodeColumnExcludeExpression);
builder.append("pojosToString", pojosToString);
builder.append("pojosAsJavaRecordClasses", pojosAsJavaRecordClasses);
builder.append("pojosAsScalaCaseClasses", pojosAsScalaCaseClasses);
@ -4945,6 +5003,24 @@ public class Generate implements Serializable, XMLAppendable
return false;
}
}
if (pojosEqualsAndHashCodeColumnIncludeExpression == null) {
if (other.pojosEqualsAndHashCodeColumnIncludeExpression!= null) {
return false;
}
} else {
if (!pojosEqualsAndHashCodeColumnIncludeExpression.equals(other.pojosEqualsAndHashCodeColumnIncludeExpression)) {
return false;
}
}
if (pojosEqualsAndHashCodeColumnExcludeExpression == null) {
if (other.pojosEqualsAndHashCodeColumnExcludeExpression!= null) {
return false;
}
} else {
if (!pojosEqualsAndHashCodeColumnExcludeExpression.equals(other.pojosEqualsAndHashCodeColumnExcludeExpression)) {
return false;
}
}
if (pojosToString == null) {
if (other.pojosToString!= null) {
return false;
@ -5732,6 +5808,8 @@ 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)+((pojosEqualsAndHashCodeColumnIncludeExpression == null)? 0 :pojosEqualsAndHashCodeColumnIncludeExpression.hashCode()));
result = ((prime*result)+((pojosEqualsAndHashCodeColumnExcludeExpression == null)? 0 :pojosEqualsAndHashCodeColumnExcludeExpression.hashCode()));
result = ((prime*result)+((pojosToString == null)? 0 :pojosToString.hashCode()));
result = ((prime*result)+((pojosAsJavaRecordClasses == null)? 0 :pojosAsJavaRecordClasses.hashCode()));
result = ((prime*result)+((pojosAsScalaCaseClasses == null)? 0 :pojosAsScalaCaseClasses.hashCode()));

View File

@ -2723,6 +2723,14 @@ 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="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>
</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>
</element>
<element name="pojosToString" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate basic toString() methods in POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>