diff --git a/src/main/java/io/ebean/dbmigration/model/build/ModelBuildBeanVisitor.java b/src/main/java/io/ebean/dbmigration/model/build/ModelBuildBeanVisitor.java index dc9f09b5b..ec8bc69fb 100644 --- a/src/main/java/io/ebean/dbmigration/model/build/ModelBuildBeanVisitor.java +++ b/src/main/java/io/ebean/dbmigration/model/build/ModelBuildBeanVisitor.java @@ -53,10 +53,12 @@ public class ModelBuildBeanVisitor implements BeanVisitor { if (inheritInfo != null && inheritInfo.isRoot()) { // add the discriminator column String discColumn = inheritInfo.getDiscriminatorColumn(); - DbPlatformType dbType = ctx.getDbTypeMap().get(inheritInfo.getDiscriminatorType()); - String discDbType = dbType.renderType(inheritInfo.getDiscriminatorLength(), 0); - - table.addColumn(new MColumn(discColumn, discDbType, true)); + String columnDefn = inheritInfo.getColumnDefn(); + if (columnDefn == null || columnDefn.isEmpty()) { + DbPlatformType dbType = ctx.getDbTypeMap().get(inheritInfo.getDiscriminatorType()); + columnDefn = dbType.renderType(inheritInfo.getDiscriminatorLength(), 0); + } + table.addColumn(new MColumn(discColumn, columnDefn, true)); } return new ModelBuildPropertyVisitor(ctx, table, descriptor); diff --git a/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java b/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java index b518e0319..78fe24a47 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java +++ b/src/main/java/io/ebeaninternal/server/deploy/InheritInfo.java @@ -26,6 +26,8 @@ public class InheritInfo { private final int discriminatorLength; + private final String columnDefn; + private final String where; private final Class type; @@ -58,6 +60,7 @@ public class InheritInfo { this.discriminatorType = deploy.getDiscriminatorType(parent); this.discriminatorLength = deploy.getDiscriminatorLength(parent); + this.columnDefn = deploy.getColumnDefn(); this.where = InternString.intern(deploy.getWhere()); if (r == null) { @@ -164,14 +167,14 @@ public class InheritInfo { public BeanProperty[] localProperties() { return descriptor.propertiesLocal(); } - + /** * Return the children. */ public ArrayList getChildren() { return children; } - + /** * Get the bean property additionally looking in the sub types. */ @@ -342,6 +345,13 @@ public class InheritInfo { return discriminatorLength; } + /** + * Return the explicit column definition. + */ + public String getColumnDefn() { + return columnDefn; + } + /** * Return the discriminator value for this node. */ diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java b/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java index a4a4f5539..517c38724 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInherit.java @@ -126,6 +126,7 @@ public class DeployInherit { info.setDiscriminatorType(Types.VARCHAR); } info.setDiscriminatorLength(da.length()); + info.setColumnDefn(da.columnDefinition()); } DiscriminatorValue dv = AnnotationBase.findAnnotation(cls, DiscriminatorValue.class); diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java b/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java index 052a304b6..a53bb847f 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/DeployInheritInfo.java @@ -26,6 +26,8 @@ public class DeployInheritInfo { private String discriminatorColumn; + private String columnDefn; + private String discriminatorWhere; private final Class type; @@ -157,6 +159,20 @@ public class DeployInheritInfo { this.discriminatorType = discriminatorType; } + /** + * Set explicit column definition (ddl). + */ + public void setColumnDefn(String columnDefn) { + this.columnDefn = columnDefn; + } + + /** + * Return the explicit column definition. + */ + public String getColumnDefn() { + return columnDefn; + } + /** * Return the length of the discriminator column. */ diff --git a/src/test/java/io/ebean/dbmigration/model/build/ModelBuildBeanVisitorTest.java b/src/test/java/io/ebean/dbmigration/model/build/ModelBuildBeanVisitorTest.java index d3379c65b..83f7da9c4 100644 --- a/src/test/java/io/ebean/dbmigration/model/build/ModelBuildBeanVisitorTest.java +++ b/src/test/java/io/ebean/dbmigration/model/build/ModelBuildBeanVisitorTest.java @@ -5,6 +5,7 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.config.DbConstraintNaming; import io.ebean.dbmigration.ddlgeneration.platform.DefaultConstraintMaxLength; +import io.ebean.dbmigration.model.MColumn; import io.ebean.dbmigration.model.MTable; import io.ebean.dbmigration.model.ModelContainer; import io.ebean.dbmigration.model.visitor.VisitAllUsing; @@ -31,12 +32,41 @@ public class ModelBuildBeanVisitorTest extends BaseTestCase { new VisitAllUsing(addTable, defaultServer).visitAllBeans(); + assert_compound_pk(model); + + assert_discriminatorColumn_explicit(model); + assert_discriminatorColumn_implied(model); + assert_discriminatorColumn_length(model); + } + + private void assert_compound_pk(ModelContainer model) { MTable item = model.getTable("item"); assertThat(item).isNotNull(); assertThat(item.primaryKeyColumns()).hasSize(2); + } - MTable customer = model.getTable("o_customer"); - assertThat(customer).isNotNull(); + private void assert_discriminatorColumn_explicit(ModelContainer model) { + + MTable configuration = model.getTable("configuration"); + MColumn discTypeColumn = configuration.getColumn("type"); + assertThat(discTypeColumn.getType()).isEqualTo("varchar(21)"); + assertThat(discTypeColumn.isNotnull()).isTrue(); + } + + private void assert_discriminatorColumn_implied(ModelContainer model) { + + MTable configuration = model.getTable("bar"); + MColumn discTypeColumn = configuration.getColumn("bar_type"); + assertThat(discTypeColumn.getType()).isEqualTo("varchar(31)"); + assertThat(discTypeColumn.isNotnull()).isTrue(); + } + + private void assert_discriminatorColumn_length(ModelContainer model) { + + MTable configuration = model.getTable("vehicle"); + MColumn discTypeColumn = configuration.getColumn("dtype"); + assertThat(discTypeColumn.getType()).isEqualTo("varchar(3)"); + assertThat(discTypeColumn.isNotnull()).isTrue(); } } diff --git a/src/test/java/org/tests/inheritance/model/Configuration.java b/src/test/java/org/tests/inheritance/model/Configuration.java index 2eeacdfa6..c58afe6c1 100644 --- a/src/test/java/org/tests/inheritance/model/Configuration.java +++ b/src/test/java/org/tests/inheritance/model/Configuration.java @@ -9,8 +9,9 @@ import javax.persistence.*; @Entity @Cache(enableQueryCache = true) @Inheritance(strategy = InheritanceType.SINGLE_TABLE) -@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING) +@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, columnDefinition = "varchar(21)") public class Configuration extends AbstractBaseClass { + @Id @Column(name = "id") private Integer id;