From bb6ff866c76e068fd6030189e1df01f834b442d1 Mon Sep 17 00:00:00 2001 From: rbygrave Date: Mon, 19 Apr 2021 21:37:05 +1200 Subject: [PATCH] #2220 - DDL generation of nullable columns expected with nullable Embedded containing non null properties --- ebean-core/pom.xml | 2 +- .../server/deploy/BeanPropertyAssocManySqlHelp.java | 6 +++--- .../server/deploy/visitor/BaseTablePropertyVisitor.java | 6 ++++-- .../server/deploy/visitor/BeanPropertyVisitor.java | 4 ++-- .../server/deploy/visitor/VisitProperties.java | 2 +- .../java/org/tests/model/embedded/EEmbDatePeriod.java | 4 ++++ .../model/build/ModelBuildPropertyVisitor.java | 8 ++++---- 7 files changed, 19 insertions(+), 13 deletions(-) diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml index 94820c06d..c07b3062c 100644 --- a/ebean-core/pom.xml +++ b/ebean-core/pom.xml @@ -72,7 +72,7 @@ io.ebean ebean-ddl-generator - 12.6.1 + 12.8.4a test diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java index 398713a18..06a2a2145 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java @@ -81,18 +81,18 @@ class BeanPropertyAssocManySqlHelp { @Override public void visitOneImported(BeanPropertyAssocOne p) { - + // do nothing } @Override - public void visitScalar(BeanProperty p) { + public void visitScalar(BeanProperty p, boolean allowNonNull) { sb.append(",").append(p.getDbColumn()); colCount++; } @Override public void visitEnd() { - + // do nothing } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BaseTablePropertyVisitor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BaseTablePropertyVisitor.java index cc23a5c1f..e6741d12a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BaseTablePropertyVisitor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BaseTablePropertyVisitor.java @@ -44,9 +44,11 @@ public abstract class BaseTablePropertyVisitor implements BeanPropertyVisitor { public abstract void visitOneImported(BeanPropertyAssocOne p); /** - * Override this method for normal scalar property. + * Override this method for normal scalar property. With allowNonNull + * used with properties of Embedded beans that can only be Nonnull when + * the Embedded bean is Nonnull. */ @Override - public abstract void visitScalar(BeanProperty p); + public abstract void visitScalar(BeanProperty p, boolean allowNonNull); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BeanPropertyVisitor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BeanPropertyVisitor.java index 1cadc2b1b..dd0dd7c6e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BeanPropertyVisitor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BeanPropertyVisitor.java @@ -40,8 +40,8 @@ public interface BeanPropertyVisitor { void visitEmbeddedScalar(BeanProperty p, BeanPropertyAssocOne embedded); /** - * Visit a scalar property. + * Visit a scalar property specify allowing non-null (e.g. embedded bean scalar properties). */ - void visitScalar(BeanProperty p); + void visitScalar(BeanProperty p, boolean allowNonNull); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java index deab1104c..5363b0add 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java @@ -72,7 +72,7 @@ public class VisitProperties { } else { // simple scalar type - pv.visitScalar(p); + pv.visitScalar(p, true); } } diff --git a/ebean-core/src/test/java/org/tests/model/embedded/EEmbDatePeriod.java b/ebean-core/src/test/java/org/tests/model/embedded/EEmbDatePeriod.java index 50cb225a3..2542a066b 100644 --- a/ebean-core/src/test/java/org/tests/model/embedded/EEmbDatePeriod.java +++ b/ebean-core/src/test/java/org/tests/model/embedded/EEmbDatePeriod.java @@ -1,12 +1,16 @@ package org.tests.model.embedded; +import io.ebean.annotation.NotNull; + import javax.persistence.Embeddable; import java.util.Date; @Embeddable public class EEmbDatePeriod { + @NotNull Date date1; + @NotNull Date date2; public Date getDate1() { diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java index 7b13cf581..3a7457a56 100644 --- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java +++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java @@ -175,7 +175,8 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { if (p instanceof BeanPropertyAssocOne) { visitOneImported((BeanPropertyAssocOne)p); } else { - visitScalar(p); + // only allow Nonnull if embedded is Nonnull + visitScalar(p, !embedded.isNullable()); } if (embedded.isId()) { // compound primary key @@ -259,8 +260,7 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { } @Override - public void visitScalar(BeanProperty p) { - + public void visitScalar(BeanProperty p, boolean allowNonNull) { if (p.isSecondaryTable()) { lastColumn = null; return; @@ -292,7 +292,7 @@ public class ModelBuildPropertyVisitor extends BaseTablePropertyVisitor { } } else { col.setDefaultValue(p.getDbColumnDefault()); - if (!p.isNullable() || p.isDDLNotNull()) { + if (allowNonNull && (!p.isNullable() || p.isDDLNotNull())) { col.setNotnull(true); } }