[jOOQ/jOOQ#17165] Embeddables replacing their fields should replace
their fields also in generated POJOs and interfaces
This commit is contained in:
parent
e39a03962c
commit
fbee6b2824
@ -2360,6 +2360,17 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the column is a non-replacing embeddable
|
||||
*/
|
||||
private boolean isNonReplacingEmbeddable(Definition column) {
|
||||
if (column instanceof EmbeddableDefinition e) {
|
||||
return !e.replacesFields();
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get embeddables and all columns.
|
||||
*/
|
||||
@ -2423,14 +2434,7 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
arguments.add(columnMember + " : " + type);
|
||||
}
|
||||
else if (kotlin) {
|
||||
final boolean nn;
|
||||
|
||||
if (column instanceof EmbeddableDefinition)
|
||||
nn = kotlinEffectivelyNotNull(out, (EmbeddableDefinition) column, Mode.RECORD);
|
||||
else
|
||||
nn = kotlinEffectivelyNotNull(out, (TypedElementDefinition<?>) column, Mode.RECORD);
|
||||
|
||||
if (nn)
|
||||
if (kotlinEffectivelyNotNull(out, column, Mode.RECORD))
|
||||
arguments.add(columnMember + ": " + type);
|
||||
else if (generateKotlinDefaultedNullableRecordAttributes())
|
||||
arguments.add(columnMember + ": " + type + "? = null");
|
||||
@ -2734,6 +2738,10 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
return out.ref(getJavaType(column, out));
|
||||
}
|
||||
|
||||
private String getJavaTypeRef(Definition column, JavaWriter out, Mode mode) {
|
||||
return out.ref(getJavaType(column, out, mode));
|
||||
}
|
||||
|
||||
/**
|
||||
* Subclasses may override this method to provide their own record setters.
|
||||
*/
|
||||
@ -2994,7 +3002,7 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println("%s%sdef %s: %s = get(%s).asInstanceOf[%s]", visibility(override), override ? "override " : "", scalaWhitespaceSuffix(getter), type, index, type);
|
||||
}
|
||||
else if (kotlin) {
|
||||
String nullable = column instanceof EmbeddableDefinition ? "" : kotlinNullability(out, column, Mode.RECORD);
|
||||
String nullable = kotlinNullability(out, column, Mode.RECORD);
|
||||
out.tab(1).println("get(): %s%s = get(%s) as %s%s", type, nullable, index, type, nullable);
|
||||
}
|
||||
else {
|
||||
@ -3220,30 +3228,36 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
else
|
||||
out.println("%sinterface %s[[before= extends ][%s]] {", visibility(), className, interfaces);
|
||||
|
||||
List<? extends TypedElementDefinition<?>> typedElements = getTypedElements(tableUdtOrEmbeddable);
|
||||
for (int i = 0; i < typedElements.size(); i++) {
|
||||
TypedElementDefinition<?> column = typedElements.get(i);
|
||||
List<Definition> embeddablesAndUnreplacedColumns = embeddablesAndUnreplacedColumns(tableUdtOrEmbeddable);
|
||||
for (int i = 0; i < embeddablesAndUnreplacedColumns.size(); i++) {
|
||||
Definition column = embeddablesAndUnreplacedColumns.get(i);
|
||||
|
||||
if (!generateImmutableInterfaces())
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition)
|
||||
generateInterfaceSetter(column, i, out);
|
||||
if (!generateImmutableInterfaces()) {
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition) {
|
||||
if (column instanceof EmbeddableDefinition e)
|
||||
generateEmbeddableInterfaceSetter(e, i, out);
|
||||
else
|
||||
generateInterfaceSetter((TypedElementDefinition<?>) column, i, out);
|
||||
}
|
||||
else {
|
||||
if (column instanceof EmbeddableDefinition e)
|
||||
generateEmbeddableInterfaceSetter(e, i, out);
|
||||
else
|
||||
generateUDTInterfaceSetter((TypedElementDefinition<?>) column, i, out);
|
||||
}
|
||||
}
|
||||
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition) {
|
||||
if (column instanceof EmbeddableDefinition e)
|
||||
generateEmbeddableInterfaceGetter(e, i, out);
|
||||
else
|
||||
generateUDTInterfaceSetter(column, i, out);
|
||||
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition)
|
||||
generateInterfaceGetter(column, i, out);
|
||||
else
|
||||
generateUDTInterfaceGetter(column, i, out);
|
||||
}
|
||||
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition) {
|
||||
List<EmbeddableDefinition> embeddables = ((TableDefinition) tableUdtOrEmbeddable).getReferencedEmbeddables();
|
||||
|
||||
for (int i = 0; i < embeddables.size(); i++) {
|
||||
EmbeddableDefinition embeddable = embeddables.get(i);
|
||||
|
||||
generateEmbeddableInterfaceSetter(embeddable, i, out);
|
||||
generateEmbeddableInterfaceGetter(embeddable, i, out);
|
||||
generateInterfaceGetter((TypedElementDefinition<?>) column, i, out);
|
||||
}
|
||||
else {
|
||||
if (column instanceof EmbeddableDefinition e)
|
||||
generateEmbeddableInterfaceGetter(e, i, out);
|
||||
else
|
||||
generateUDTInterfaceGetter((TypedElementDefinition<?>) column, i, out);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5409,13 +5423,25 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println("%s%s getId(%s object) {", visibilityPublic(), tType, pType);
|
||||
}
|
||||
|
||||
String prefix = "";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (keyColumns.size() == 1) {
|
||||
if (scala)
|
||||
out.println("o.%s", getStrategy().getJavaGetterName(keyColumns.get(0), Mode.POJO));
|
||||
out.println("o.%s%s", prefix, getStrategy().getJavaGetterName(keyColumns.get(0), Mode.POJO));
|
||||
else if (kotlin)
|
||||
out.println("o.%s", getStrategy().getJavaMemberName(keyColumns.get(0), Mode.POJO));
|
||||
out.println("o.%s%s", prefix, getStrategy().getJavaMemberName(keyColumns.get(0), Mode.POJO));
|
||||
else
|
||||
out.println("return object.%s();",
|
||||
out.println("return object.%s%s();",
|
||||
prefix,
|
||||
generatePojosAsJavaRecordClasses()
|
||||
? getStrategy().getJavaMemberName(keyColumns.get(0), Mode.POJO)
|
||||
: getStrategy().getJavaGetterName(keyColumns.get(0), Mode.POJO)
|
||||
@ -5425,14 +5451,15 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
// [#2574] This should be replaced by a call to a method on the target table's Key type
|
||||
else {
|
||||
StringBuilder params = new StringBuilder();
|
||||
String p = prefix;
|
||||
|
||||
forEach(keyColumns, "", ", ", (column, separator) -> {
|
||||
if (scala)
|
||||
params.append("o.").append(getStrategy().getJavaGetterName(column, Mode.POJO));
|
||||
params.append("o.").append(p).append(getStrategy().getJavaGetterName(column, Mode.POJO));
|
||||
else if (kotlin)
|
||||
params.append("o.").append(getStrategy().getJavaMemberName(column, Mode.POJO));
|
||||
params.append("o.").append(p).append(getStrategy().getJavaMemberName(column, Mode.POJO));
|
||||
else
|
||||
params.append("object.").append(
|
||||
params.append("object.").append(p).append(
|
||||
generatePojosAsJavaRecordClasses()
|
||||
? getStrategy().getJavaMemberName(column, Mode.POJO)
|
||||
: getStrategy().getJavaGetterName(column, Mode.POJO)
|
||||
@ -5503,7 +5530,7 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
visibility(), colMemberUC, colType, colType, out.ref(KLIST), pType, colIdentifier, colTypeRecord, colTypeRecord);
|
||||
}
|
||||
else {
|
||||
final String nullability = kotlinNullability(out, (TypedElementDefinition<?>) column, Mode.POJO);
|
||||
final String nullability = kotlinNullability(out, column, Mode.POJO);
|
||||
|
||||
out.println("%sfun fetchRangeOf%s(lowerInclusive: %s%s, upperInclusive: %s%s): %s<%s> = fetchRange(%s, lowerInclusive, upperInclusive)",
|
||||
visibility(), colMemberUC, colType, nullability, colType, nullability, out.ref(KLIST), pType, colIdentifier);
|
||||
@ -5707,15 +5734,18 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition)
|
||||
printTableJPAAnnotation(out, (TableDefinition) tableUdtOrEmbeddable);
|
||||
|
||||
List<Definition> embeddablesAndUnreplacedColumns = embeddablesAndUnreplacedColumns(tableUdtOrEmbeddable);
|
||||
List<Definition> replacingEmbeddablesAndUnreplacedColumns = replacingEmbeddablesAndUnreplacedColumns(tableUdtOrEmbeddable);
|
||||
|
||||
if (scala) {
|
||||
out.println("%s%s%sclass %s(", visibility(), abstract_, (generatePojosAsScalaCaseClasses() ? "case " : ""), className);
|
||||
|
||||
forEach(getTypedElements(tableUdtOrEmbeddable), (column, separator) -> {
|
||||
forEach(replacingEmbeddablesAndUnreplacedColumns, (column, separator) -> {
|
||||
out.println("%s%s %s: %s%s",
|
||||
visibility(generateInterfaces()),
|
||||
generateImmutablePojos() ? "val" : "var",
|
||||
scalaWhitespaceSuffix(getStrategy().getJavaMemberName(column, Mode.POJO)),
|
||||
out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)),
|
||||
getJavaTypeRef(column, out, Mode.POJO),
|
||||
separator
|
||||
);
|
||||
});
|
||||
@ -5725,7 +5755,7 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
else if (kotlin) {
|
||||
out.println("%s%s%sclass %s(", visibility(), abstract_, (generatePojosAsKotlinDataClasses() ? "data " : ""), className);
|
||||
|
||||
forEach(getTypedElements(tableUdtOrEmbeddable), (column, separator) -> {
|
||||
forEach(replacingEmbeddablesAndUnreplacedColumns, (column, separator) -> {
|
||||
final String member = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
final String nullability = kotlinNullability(out, column, Mode.POJO);
|
||||
final boolean override = getStrategy().getJavaMemberOverride(column, Mode.POJO);
|
||||
@ -5733,16 +5763,18 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
if (column instanceof ColumnDefinition)
|
||||
printColumnJPAAnnotation(out, (ColumnDefinition) column);
|
||||
|
||||
printValidationAnnotation(out, column);
|
||||
if (!generateImmutablePojos())
|
||||
printKotlinSetterAnnotation(out, column, Mode.POJO);
|
||||
if (column instanceof TypedElementDefinition<?> ted) {
|
||||
printValidationAnnotation(out, ted);
|
||||
if (!generateImmutablePojos())
|
||||
printKotlinSetterAnnotation(out, ted, Mode.POJO);
|
||||
}
|
||||
|
||||
out.println("%s%s%s %s: %s%s%s%s",
|
||||
visibility(generateInterfaces()),
|
||||
generateInterfaces() || override ? "override " : "",
|
||||
generateImmutablePojos() ? "val" : "var",
|
||||
member,
|
||||
out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)),
|
||||
getJavaTypeRef(column, out, Mode.POJO),
|
||||
nullability,
|
||||
nullability.isEmpty()
|
||||
? ""
|
||||
@ -5759,10 +5791,10 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
if (generatePojosAsJavaRecordClasses()) {
|
||||
out.println("%srecord %s(", visibility(), className);
|
||||
|
||||
forEach(getTypedElements(tableUdtOrEmbeddable), (column, separator) -> {
|
||||
forEach(replacingEmbeddablesAndUnreplacedColumns, (column, separator) -> {
|
||||
out.println("[[before=@][after= ][%s]]%s %s%s",
|
||||
list(nullableOrNonnullAnnotation(out, column)),
|
||||
out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)),
|
||||
getJavaTypeRef(column, out, Mode.POJO),
|
||||
getStrategy().getJavaMemberName(column, Mode.POJO),
|
||||
separator);
|
||||
});
|
||||
@ -5779,11 +5811,12 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println();
|
||||
|
||||
if (!generatePojosAsJavaRecordClasses())
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableUdtOrEmbeddable))
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
out.println("private %s%s %s;",
|
||||
generateImmutablePojos() ? "final " : "",
|
||||
out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)),
|
||||
getJavaTypeRef(column, out, Mode.POJO),
|
||||
getStrategy().getJavaMemberName(column, Mode.POJO));
|
||||
}
|
||||
}
|
||||
|
||||
// Constructors
|
||||
@ -5793,7 +5826,18 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
if (!generateImmutablePojos() && !generatePojosAsJavaRecordClasses())
|
||||
generatePojoDefaultConstructor(tableUdtOrEmbeddable, out);
|
||||
|
||||
if (!kotlin) {
|
||||
if (kotlin) {
|
||||
for (int i = 0; i < embeddablesAndUnreplacedColumns.size(); i++) {
|
||||
Definition column = embeddablesAndUnreplacedColumns.get(i);
|
||||
|
||||
if (isNonReplacingEmbeddable(column)) {
|
||||
if (!generateImmutablePojos())
|
||||
generateEmbeddablePojoSetter((EmbeddableDefinition) column, i, out);
|
||||
generateEmbeddablePojoGetter((EmbeddableDefinition) column, i, out);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!generatePojosAsJavaRecordClasses()) {
|
||||
|
||||
// [#1363] [#7055] copy constructor
|
||||
@ -5803,47 +5847,31 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
generatePojoMultiConstructor(tableUdtOrEmbeddable, out);
|
||||
}
|
||||
|
||||
List<? extends TypedElementDefinition<?>> elements = getTypedElements(tableUdtOrEmbeddable);
|
||||
for (int i = 0; i < elements.size(); i++) {
|
||||
TypedElementDefinition<?> column = elements.get(i);
|
||||
for (int i = 0; i < embeddablesAndUnreplacedColumns.size(); i++) {
|
||||
Definition column = embeddablesAndUnreplacedColumns.get(i);
|
||||
|
||||
if (!generatePojosAsJavaRecordClasses() || generateInterfaces())
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition)
|
||||
generatePojoGetter(column, i, out);
|
||||
if (!generatePojosAsJavaRecordClasses() || generateInterfaces() || isNonReplacingEmbeddable(column)) {
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition) {
|
||||
if (column instanceof EmbeddableDefinition e)
|
||||
generateEmbeddablePojoGetter(e, i, out);
|
||||
else
|
||||
generatePojoGetter((TypedElementDefinition<?>) column, i, out);
|
||||
}
|
||||
else
|
||||
generateUDTPojoGetter(column, i, out);
|
||||
generateUDTPojoGetter((TypedElementDefinition<?>) column, i, out);
|
||||
}
|
||||
|
||||
// Setter
|
||||
if (!generateImmutablePojos())
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition)
|
||||
generatePojoSetter(column, i, out);
|
||||
if (!generateImmutablePojos()) {
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition) {
|
||||
if (column instanceof EmbeddableDefinition e)
|
||||
generateEmbeddablePojoSetter(e, i, out);
|
||||
else
|
||||
generatePojoSetter((TypedElementDefinition<?>) column, i, out);
|
||||
}
|
||||
else
|
||||
generateUDTPojoSetter(column, i, out);
|
||||
}
|
||||
}
|
||||
|
||||
if (tableUdtOrEmbeddable instanceof TableDefinition) {
|
||||
List<EmbeddableDefinition> embeddables = ((TableDefinition) tableUdtOrEmbeddable).getReferencedEmbeddables();
|
||||
|
||||
embeddablesLoop:
|
||||
for (int i = 0; i < embeddables.size(); i++) {
|
||||
EmbeddableDefinition embeddable = embeddables.get(i);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (!generateImmutablePojos())
|
||||
generateEmbeddablePojoSetter(embeddable, i, out);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
generateEmbeddablePojoGetter(embeddable, i, out);
|
||||
generateUDTPojoSetter((TypedElementDefinition<?>) column, i, out);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5866,14 +5894,17 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println("}");
|
||||
closeJavaWriter(out);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subclasses may override this method to provide their own pojo copy constructors.
|
||||
*/
|
||||
protected void generatePojoMultiConstructor(Definition tableOrUDT, JavaWriter out) {
|
||||
final String className = getStrategy().getJavaClassName(tableOrUDT, Mode.POJO);
|
||||
protected void generatePojoMultiConstructor(Definition tableOrUDTOrEmbeddable, JavaWriter out) {
|
||||
final String className = getStrategy().getJavaClassName(tableOrUDTOrEmbeddable, Mode.POJO);
|
||||
final List<String> properties = new ArrayList<>();
|
||||
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT))
|
||||
List<Definition> replacingEmbeddablesAndUnreplacedColumns = replacingEmbeddablesAndUnreplacedColumns(tableOrUDTOrEmbeddable);
|
||||
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns)
|
||||
properties.add("\"" + escapeString(getStrategy().getJavaMemberName(column, Mode.POJO)) + "\"");
|
||||
|
||||
if (scala) {
|
||||
@ -5881,8 +5912,8 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
|
||||
// [#3010] Invalid UDTs may have no attributes. Avoid generating this constructor in that case
|
||||
// [#3176] Avoid generating constructors for tables with more than 255 columns (Java's method argument limit)
|
||||
else if (getTypedElements(tableOrUDT).size() > 0 &&
|
||||
getTypedElements(tableOrUDT).size() < 255) {
|
||||
else if (replacingEmbeddablesAndUnreplacedColumns.size() > 0 &&
|
||||
replacingEmbeddablesAndUnreplacedColumns.size() < 255) {
|
||||
out.println();
|
||||
|
||||
if (generateConstructorPropertiesAnnotationOnPojos())
|
||||
@ -5891,21 +5922,21 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.print("%s%s(", visibility(), className);
|
||||
|
||||
String separator1 = "";
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String nullableAnnotation = nullableOrNonnullAnnotation(out, column);
|
||||
|
||||
out.println(separator1);
|
||||
out.print("[[before=@][after= ][%s]]%s %s",
|
||||
list(nullableAnnotation),
|
||||
out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)),
|
||||
getStrategy().getJavaMemberName(column, Mode.POJO));
|
||||
getJavaTypeRef(column, out, Mode.POJO),
|
||||
getStrategy().getJavaMemberName(column, generateInterfaces() ? Mode.INTERFACE : Mode.POJO));
|
||||
separator1 = ",";
|
||||
}
|
||||
|
||||
out.println();
|
||||
out.println(") {");
|
||||
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
|
||||
out.println("this.%s = %s;", columnMember, columnMember);
|
||||
@ -5918,18 +5949,20 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
/**
|
||||
* Subclasses may override this method to provide their own pojo copy constructors.
|
||||
*/
|
||||
protected void generatePojoCopyConstructor(Definition tableOrUDT, JavaWriter out) {
|
||||
final String className = getStrategy().getJavaClassName(tableOrUDT, Mode.POJO);
|
||||
protected void generatePojoCopyConstructor(Definition tableUdtOrEmbeddable, JavaWriter out) {
|
||||
final String className = getStrategy().getJavaClassName(tableUdtOrEmbeddable, Mode.POJO);
|
||||
final String interfaceName = generateInterfaces()
|
||||
? out.ref(getStrategy().getFullJavaClassName(tableOrUDT, Mode.INTERFACE))
|
||||
? out.ref(getStrategy().getFullJavaClassName(tableUdtOrEmbeddable, Mode.INTERFACE))
|
||||
: "";
|
||||
|
||||
List<Definition> replacingEmbeddablesAndUnreplacedColumns = replacingEmbeddablesAndUnreplacedColumns(tableUdtOrEmbeddable);
|
||||
|
||||
out.println();
|
||||
|
||||
if (scala) {
|
||||
out.println("%sdef this(value: %s) = this(", visibility(), generateInterfaces() ? interfaceName : className);
|
||||
|
||||
forEach(getTypedElements(tableOrUDT), (column, separator) -> {
|
||||
forEach(replacingEmbeddablesAndUnreplacedColumns, (column, separator) -> {
|
||||
out.println("value.%s%s",
|
||||
generateInterfaces()
|
||||
? getStrategy().getJavaGetterName(column, Mode.INTERFACE)
|
||||
@ -5949,7 +5982,7 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
if (generatePojosAsJavaRecordClasses()) {
|
||||
out.println("this(");
|
||||
|
||||
forEach(getTypedElements(tableOrUDT), (column, separator) -> {
|
||||
forEach(replacingEmbeddablesAndUnreplacedColumns, (column, separator) -> {
|
||||
out.println("value.%s%s%s",
|
||||
generateInterfaces()
|
||||
? getStrategy().getJavaGetterName(column, Mode.INTERFACE)
|
||||
@ -5963,15 +5996,31 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println(");");
|
||||
}
|
||||
else {
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
out.println("this.%s = value.%s%s;",
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
String prefix = "";
|
||||
String suffix = "";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
out.println("this.%s = %svalue.%s%s%s;",
|
||||
getStrategy().getJavaMemberName(column, Mode.POJO),
|
||||
prefix,
|
||||
generateInterfaces()
|
||||
? getStrategy().getJavaGetterName(column, Mode.INTERFACE)
|
||||
: getStrategy().getJavaMemberName(column, Mode.POJO),
|
||||
generateInterfaces()
|
||||
? "()"
|
||||
: "");
|
||||
: "",
|
||||
suffix
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -6041,40 +6090,65 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
|
||||
printNonnullAnnotation(out);
|
||||
|
||||
if (scala) {
|
||||
out.println("%s%sdef %s: %s = new %s(", visibility(override), override ? "override " : "", scalaWhitespaceSuffix(columnGetter), columnType, columnType);
|
||||
}
|
||||
else if (kotlin) {
|
||||
|
||||
// [#14853] The POJO property hasn't been generated in the setter, if the POJO
|
||||
// is immutable, as there are no setters.
|
||||
if (generateImmutablePojos())
|
||||
generateEmbeddablePojoProperty(out, generateImmutableInterfaces(), override, columnTypeDeclared, columnMember);
|
||||
|
||||
out.tab(1).println("get(): %s = %s(", columnTypeDeclared, columnType);
|
||||
}
|
||||
else {
|
||||
out.overrideIf(override);
|
||||
out.println("%s%s %s() {", visibility(generateInterfaces()), columnType, columnGetter);
|
||||
out.println("return new %s(", columnType);
|
||||
}
|
||||
|
||||
forEach(embeddable.getColumns(), (column, separator) -> {
|
||||
if (kotlin)
|
||||
out.tab(1).println("%s%s", getStrategy().getJavaMemberName(column.getReferencingColumn(), Mode.POJO), separator);
|
||||
else if (generatePojosAsJavaRecordClasses())
|
||||
out.println("%s%s%s", getStrategy().getJavaMemberName(column.getReferencingColumn(), Mode.POJO), emptyparens, separator);
|
||||
else
|
||||
out.println("this.%s%s", getStrategy().getJavaMemberName(column.getReferencingColumn(), Mode.POJO), separator);
|
||||
});
|
||||
|
||||
if (scala)
|
||||
out.println(")");
|
||||
else if (kotlin)
|
||||
out.tab(1).println(")");
|
||||
else {
|
||||
out.println(");");
|
||||
out.println("}");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{
|
||||
if (scala) {
|
||||
out.println("%s%sdef %s: %s = new %s(", visibility(override), override ? "override " : "", scalaWhitespaceSuffix(columnGetter), columnType, columnType);
|
||||
}
|
||||
else if (kotlin) {
|
||||
|
||||
// [#14853] The POJO property hasn't been generated in the setter, if the POJO
|
||||
// is immutable, as there are no setters.
|
||||
if (generateImmutablePojos())
|
||||
generateEmbeddablePojoProperty(out, generateImmutableInterfaces(), override, columnTypeDeclared, columnMember);
|
||||
|
||||
out.tab(1).println("get(): %s = %s(", columnTypeDeclared, columnType);
|
||||
}
|
||||
else {
|
||||
out.overrideIf(override);
|
||||
out.println("%s%s %s() {", visibility(generateInterfaces()), columnType, columnGetter);
|
||||
out.println("return new %s(", columnType);
|
||||
}
|
||||
|
||||
forEach(embeddable.getColumns(), (column, separator) -> {
|
||||
if (kotlin)
|
||||
out.tab(1).println("%s%s", getStrategy().getJavaMemberName(column.getReferencingColumn(), Mode.POJO), separator);
|
||||
else if (generatePojosAsJavaRecordClasses())
|
||||
out.println("%s%s%s", getStrategy().getJavaMemberName(column.getReferencingColumn(), Mode.POJO), emptyparens, separator);
|
||||
else
|
||||
out.println("this.%s%s", getStrategy().getJavaMemberName(column.getReferencingColumn(), Mode.POJO), separator);
|
||||
});
|
||||
|
||||
if (scala)
|
||||
out.println(")");
|
||||
else if (kotlin)
|
||||
out.tab(1).println(")");
|
||||
else {
|
||||
out.println(");");
|
||||
out.println("}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -6130,6 +6204,8 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
final String className = getStrategy().getJavaClassName(embeddable.getReferencingTable(), Mode.POJO);
|
||||
final String columnTypeFull = getStrategy().getFullJavaClassName(embeddable, override ? Mode.INTERFACE : Mode.POJO);
|
||||
final String columnType = out.ref(columnTypeFull);
|
||||
final String columnTypeFullPojo = getStrategy().getFullJavaClassName(embeddable, Mode.POJO);
|
||||
final String columnTypePojo = out.ref(columnTypeFullPojo);
|
||||
final String columnSetterReturnType = generateFluentSetters() ? className : tokenVoid;
|
||||
final String columnSetter = getStrategy().getJavaSetterName(embeddable, Mode.POJO);
|
||||
final String columnMember = getStrategy().getJavaMemberName(embeddable, Mode.POJO);
|
||||
@ -6166,6 +6242,15 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
for (EmbeddableColumnDefinition column : embeddable.getColumns()) {
|
||||
final String s = getStrategy().getJavaMemberName(column.getReferencingColumn(), Mode.POJO);
|
||||
final String g = getStrategy().getJavaGetterName(column, Mode.POJO);
|
||||
@ -6284,12 +6369,13 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
protected void generatePojoEqualsAndHashCode(Definition tableOrUDT, JavaWriter out) {
|
||||
protected void generatePojoEqualsAndHashCode(Definition tableUdtOrEmbeddable, JavaWriter out) {
|
||||
// [#10805] We used to prevent equals and hash code when generating case classes, data classes
|
||||
// or record classes. There isn't really a good reason for this. Users can define
|
||||
// the flags themselves to their liking, and in some cases, overriding is still required
|
||||
// e.g. in the presence of arrays.
|
||||
final String className = getStrategy().getJavaClassName(tableOrUDT, Mode.POJO);
|
||||
final String className = getStrategy().getJavaClassName(tableUdtOrEmbeddable, Mode.POJO);
|
||||
List<Definition> replacingEmbeddablesAndUnreplacedColumns = replacingEmbeddablesAndUnreplacedColumns(tableUdtOrEmbeddable);
|
||||
|
||||
out.println();
|
||||
|
||||
@ -6304,7 +6390,7 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
|
||||
out.println("val other = obj.asInstanceOf[%s]", className);
|
||||
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
|
||||
out.println("if (this.%s == null) {", columnMember);
|
||||
@ -6312,7 +6398,7 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println("return false");
|
||||
out.println("}");
|
||||
|
||||
if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
if (isArrayType(getJavaType(column, out)))
|
||||
out.println("else if (!(this.%s sameElements other.%s))", columnMember, columnMember);
|
||||
else
|
||||
out.println("else if (!this.%s.equals(other.%s))", columnMember, columnMember);
|
||||
@ -6334,14 +6420,14 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
|
||||
out.println("val o: %s = other as %s", className, className);
|
||||
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
final boolean nn = kotlinEffectivelyNotNull(out, column, Mode.POJO);
|
||||
|
||||
if (nn) {
|
||||
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
if (isObjectArrayType(getJavaType(column, out)))
|
||||
out.println("if (!%s.deepEquals(this.%s, o.%s))", Arrays.class, columnMember, columnMember);
|
||||
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
else if (isArrayType(getJavaType(column, out)))
|
||||
out.println("if (!%s.equals(this.%s, o.%s))", Arrays.class, columnMember, columnMember);
|
||||
else
|
||||
out.println("if (this.%s != o.%s)", columnMember, columnMember);
|
||||
@ -6352,9 +6438,9 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println("return false");
|
||||
out.println("}");
|
||||
|
||||
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
if (isObjectArrayType(getJavaType(column, out)))
|
||||
out.println("else if (!%s.deepEquals(this.%s, o.%s))", Arrays.class, columnMember, columnMember);
|
||||
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
else if (isArrayType(getJavaType(column, out)))
|
||||
out.println("else if (!%s.equals(this.%s, o.%s))", Arrays.class, columnMember, columnMember);
|
||||
else
|
||||
out.println("else if (this.%s != o.%s)", columnMember, columnMember);
|
||||
@ -6378,7 +6464,7 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
|
||||
out.println("final %s other = (%s) obj;", className, className);
|
||||
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
|
||||
out.println("if (this.%s == null) {", columnMember);
|
||||
@ -6386,9 +6472,9 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println("return false;");
|
||||
out.println("}");
|
||||
|
||||
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
if (isObjectArrayType(getJavaType(column, out)))
|
||||
out.println("else if (!%s.deepEquals(this.%s, other.%s))", Arrays.class, columnMember, columnMember);
|
||||
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
else if (isArrayType(getJavaType(column, out)))
|
||||
out.println("else if (!%s.equals(this.%s, other.%s))", Arrays.class, columnMember, columnMember);
|
||||
else
|
||||
out.println("else if (!this.%s.equals(other.%s))", columnMember, columnMember);
|
||||
@ -6407,10 +6493,10 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println("val prime = 31");
|
||||
out.println("var result = 1");
|
||||
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
|
||||
if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
if (isArrayType(getJavaType(column, out)))
|
||||
out.println("result = prime * result + (if (this.%s == null) 0 else %s.toSeq.hashCode)", columnMember, columnMember);
|
||||
else
|
||||
out.println("result = prime * result + (if (this.%s == null) 0 else this.%s.hashCode)", columnMember, columnMember);
|
||||
@ -6424,22 +6510,22 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println("val prime = 31");
|
||||
out.println("var result = 1");
|
||||
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
final boolean nn = kotlinEffectivelyNotNull(out, column, Mode.POJO);
|
||||
|
||||
if (nn) {
|
||||
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
if (isObjectArrayType(getJavaType(column, out)))
|
||||
out.println("result = prime * result + %s.deepHashCode(this.%s)", Arrays.class, columnMember);
|
||||
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
else if (isArrayType(getJavaType(column, out)))
|
||||
out.println("result = prime * result + %s.hashCode(this.%s)", Arrays.class, columnMember);
|
||||
else
|
||||
out.println("result = prime * result + this.%s.hashCode()", columnMember);
|
||||
}
|
||||
else {
|
||||
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
if (isObjectArrayType(getJavaType(column, out)))
|
||||
out.println("result = prime * result + (if (this.%s == null) 0 else %s.deepHashCode(this.%s))", columnMember, Arrays.class, columnMember);
|
||||
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
else if (isArrayType(getJavaType(column, out)))
|
||||
out.println("result = prime * result + (if (this.%s == null) 0 else %s.hashCode(this.%s))", columnMember, Arrays.class, columnMember);
|
||||
else
|
||||
out.println("result = prime * result + (if (this.%s == null) 0 else this.%s.hashCode())", columnMember, columnMember);
|
||||
@ -6455,12 +6541,12 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println("final int prime = 31;");
|
||||
out.println("int result = 1;");
|
||||
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
|
||||
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
if (isObjectArrayType(getJavaType(column, out)))
|
||||
out.println("result = prime * result + ((this.%s == null) ? 0 : %s.deepHashCode(this.%s));", columnMember, Arrays.class, columnMember);
|
||||
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
|
||||
else if (isArrayType(getJavaType(column, out)))
|
||||
out.println("result = prime * result + ((this.%s == null) ? 0 : %s.hashCode(this.%s));", columnMember, Arrays.class, columnMember);
|
||||
else
|
||||
out.println("result = prime * result + ((this.%s == null) ? 0 : this.%s.hashCode());", columnMember, columnMember);
|
||||
@ -6471,8 +6557,9 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
protected void generatePojoToString(Definition tableOrUDT, JavaWriter out) {
|
||||
final String className = getStrategy().getJavaClassName(tableOrUDT, Mode.POJO);
|
||||
protected void generatePojoToString(Definition tableUdtOrEmbeddable, JavaWriter out) {
|
||||
final String className = getStrategy().getJavaClassName(tableUdtOrEmbeddable, Mode.POJO);
|
||||
List<Definition> replacingEmbeddablesAndUnreplacedColumns = replacingEmbeddablesAndUnreplacedColumns(tableUdtOrEmbeddable);
|
||||
|
||||
out.println();
|
||||
|
||||
@ -6483,9 +6570,9 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println();
|
||||
|
||||
String separator = "";
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
final String columnType = getJavaType(column.getType(resolver(out)), out);
|
||||
final String columnType = getJavaType(column, out);
|
||||
final boolean array = isArrayType(columnType);
|
||||
|
||||
if (columnType.equals("scala.Array[scala.Byte]"))
|
||||
@ -6510,9 +6597,9 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println();
|
||||
|
||||
String separator = "";
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
final String columnType = getJavaType(column.getType(resolver(out)), out);
|
||||
final String columnType = getJavaType(column, out);
|
||||
final boolean array = isArrayType(columnType);
|
||||
|
||||
if (array && columnType.equals("kotlin.ByteArray"))
|
||||
@ -6537,9 +6624,9 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
out.println();
|
||||
|
||||
String separator = "";
|
||||
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
|
||||
for (Definition column : replacingEmbeddablesAndUnreplacedColumns) {
|
||||
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
|
||||
final String columnType = getJavaType(column.getType(resolver(out)), out);
|
||||
final String columnType = getJavaType(column, out);
|
||||
final boolean array = isArrayType(columnType);
|
||||
|
||||
if (array && columnType.equals("byte[]"))
|
||||
@ -9495,14 +9582,21 @@ public class JavaGenerator extends AbstractGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
private String kotlinNullability(JavaWriter out, TypedElementDefinition<?> typed) {
|
||||
private String kotlinNullability(JavaWriter out, Definition typed) {
|
||||
return kotlinNullability(out, typed, Mode.DEFAULT);
|
||||
}
|
||||
|
||||
private String kotlinNullability(JavaWriter out, TypedElementDefinition<?> typed, Mode mode) {
|
||||
private String kotlinNullability(JavaWriter out, Definition typed, Mode mode) {
|
||||
return kotlinEffectivelyNotNull(out, typed, mode) ? "" : "?";
|
||||
}
|
||||
|
||||
private boolean kotlinEffectivelyNotNull(JavaWriter out, Definition column, Mode mode) {
|
||||
if (column instanceof EmbeddableDefinition e)
|
||||
return kotlinEffectivelyNotNull(out, e, mode);
|
||||
else
|
||||
return kotlinEffectivelyNotNull(out, (TypedElementDefinition<?>) column, mode);
|
||||
}
|
||||
|
||||
private boolean kotlinEffectivelyNotNull(JavaWriter out, EmbeddableDefinition e, Mode mode) {
|
||||
for (EmbeddableColumnDefinition c : e.getColumns())
|
||||
if (kotlinEffectivelyNotNull(out, c, mode))
|
||||
|
||||
Loading…
Reference in New Issue
Block a user