diff --git a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java index 89b87bf35..4ffe6074b 100644 --- a/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java +++ b/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java @@ -588,21 +588,27 @@ public final class DefaultTypeManager implements TypeManager { @Override public ScalarType createEnumScalarType(Class> enumType, EnumType type) { - ScalarTypeEnum scalarType = (ScalarTypeEnum) getScalarType(enumType); - if (scalarType != null && !scalarType.isOverrideBy(type)) { - if (type != null && !scalarType.isCompatible(type)) { - throw new IllegalStateException("Error mapping Enum type:" + enumType + " It is mapped using 2 different modes when only one is supported (ORDINAL, STRING or an Ebean mapping)"); - } + ScalarType scalarType = getScalarType(enumType); + if (scalarType instanceof ScalarTypeWrapper) { + // no override or further mapping required return scalarType; } - scalarType = createEnumScalarTypePerExtentions(enumType); - if (scalarType == null) { - // use JPA normal Enum type (without mapping) - scalarType = createEnumScalarTypePerSpec(enumType, type); + ScalarTypeEnum scalarEnum = (ScalarTypeEnum)scalarType; + if (scalarEnum != null && !scalarEnum.isOverrideBy(type)) { + if (type != null && !scalarEnum.isCompatible(type)) { + throw new IllegalStateException("Error mapping Enum type:" + enumType + " It is mapped using 2 different modes when only one is supported (ORDINAL, STRING or an Ebean mapping)"); + } + return scalarEnum; } - addEnumType(scalarType, enumType); - return scalarType; + + scalarEnum = createEnumScalarTypePerExtentions(enumType); + if (scalarEnum == null) { + // use JPA normal Enum type (without mapping) + scalarEnum = createEnumScalarTypePerSpec(enumType, type); + } + addEnumType(scalarEnum, enumType); + return scalarEnum; } private ScalarTypeEnum createEnumScalarTypePerSpec(Class enumType, EnumType type) { diff --git a/src/test/java/org/tests/model/ddd/DExhEntity.java b/src/test/java/org/tests/model/ddd/DExhEntity.java index 73252744c..7e4a03777 100644 --- a/src/test/java/org/tests/model/ddd/DExhEntity.java +++ b/src/test/java/org/tests/model/ddd/DExhEntity.java @@ -1,6 +1,7 @@ package org.tests.model.ddd; import org.tests.model.ivo.Oid; +import org.tests.model.ivo.converter.AnEnumType; import javax.persistence.Entity; import javax.persistence.Id; @@ -15,6 +16,8 @@ public class DExhEntity { String exhange; + AnEnumType anEnumType; + @Version Timestamp lastUpdated; @@ -42,4 +45,11 @@ public class DExhEntity { this.lastUpdated = lastUpdated; } + public AnEnumType getAnEnumType() { + return anEnumType; + } + + public void setAnEnumType(AnEnumType anEnumType) { + this.anEnumType = anEnumType; + } } diff --git a/src/test/java/org/tests/model/ddd/TestScalarTypeConverter.java b/src/test/java/org/tests/model/ddd/TestScalarTypeConverter.java new file mode 100644 index 000000000..dec65742a --- /dev/null +++ b/src/test/java/org/tests/model/ddd/TestScalarTypeConverter.java @@ -0,0 +1,27 @@ +package org.tests.model.ddd; + +import io.ebean.Ebean; +import org.junit.Test; +import org.tests.model.ivo.Oid; +import org.tests.model.ivo.converter.AnEnumType; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestScalarTypeConverter { + + @Test + public void integration() { + + DExhEntity exhEntity = new DExhEntity(); + exhEntity.setOid(new Oid<>(12)); + exhEntity.setAnEnumType(AnEnumType.ONE); + + Ebean.save(exhEntity); + + int count = Ebean.find(DExhEntity.class) + .where().eq("anEnumType", AnEnumType.ONE) + .findCount(); + + assertThat(count).isGreaterThan(0); + } +} diff --git a/src/test/java/org/tests/model/ivo/converter/AnEnumType.java b/src/test/java/org/tests/model/ivo/converter/AnEnumType.java new file mode 100644 index 000000000..cbf435e9b --- /dev/null +++ b/src/test/java/org/tests/model/ivo/converter/AnEnumType.java @@ -0,0 +1,6 @@ +package org.tests.model.ivo.converter; + +public enum AnEnumType { + ONE, + TWO +} diff --git a/src/test/java/org/tests/model/ivo/converter/AnEnumTypeConvert.java b/src/test/java/org/tests/model/ivo/converter/AnEnumTypeConvert.java new file mode 100644 index 000000000..06bce5367 --- /dev/null +++ b/src/test/java/org/tests/model/ivo/converter/AnEnumTypeConvert.java @@ -0,0 +1,21 @@ +package org.tests.model.ivo.converter; + +import io.ebean.config.ScalarTypeConverter; + +public class AnEnumTypeConvert implements ScalarTypeConverter { + + @Override + public AnEnumType getNullValue() { + return null; + } + + @Override + public AnEnumType wrapValue(String value) { + return AnEnumType.valueOf(value); + } + + @Override + public String unwrapValue(AnEnumType beanType) { + return beanType.name(); + } +}