From 49ab17cd345416abc54c3005104c2867cc700ef7 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Tue, 26 Jun 2018 22:11:40 +1200 Subject: [PATCH] #1438 - Mapping of @ElementCollection with an Enum that is otherwise not used produces error --- .../deploy/parse/AnnotationAssocManys.java | 9 +++ .../model/elementcollection/EcEnumPerson.java | 70 +++++++++++++++++++ .../TestElementCollectionEnumSet.java | 33 +++++++++ 3 files changed, 112 insertions(+) create mode 100644 src/test/java/org/tests/model/elementcollection/EcEnumPerson.java create mode 100644 src/test/java/org/tests/model/elementcollection/TestElementCollectionEnumSet.java diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java index b628c290b..a5e317ea3 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java @@ -28,6 +28,7 @@ import javax.persistence.CascadeType; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; +import javax.persistence.EnumType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; @@ -245,6 +246,10 @@ class AnnotationAssocManys extends AnnotationParser { } ScalarType valueScalarType = util.getTypeManager().getScalarType(elementType); + if (valueScalarType == null && elementType.isEnum()) { + Class> enumClass = (Class>)elementType; + valueScalarType = util.getTypeManager().createEnumScalarType(enumClass, EnumType.STRING); + } boolean scalar = true; if (valueScalarType == null) { @@ -275,6 +280,10 @@ class AnnotationAssocManys extends AnnotationParser { } private void setElementProperty(DeployBeanProperty elementProp, String name, String dbColumn, int sortOrder) { + + if (dbColumn == null) { + dbColumn = "value"; + } elementProp.setName(name); elementProp.setDbColumn(dbColumn); elementProp.setNullable(false); diff --git a/src/test/java/org/tests/model/elementcollection/EcEnumPerson.java b/src/test/java/org/tests/model/elementcollection/EcEnumPerson.java new file mode 100644 index 000000000..96805eef7 --- /dev/null +++ b/src/test/java/org/tests/model/elementcollection/EcEnumPerson.java @@ -0,0 +1,70 @@ +package org.tests.model.elementcollection; + +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Version; +import java.util.LinkedHashSet; +import java.util.Set; + +@Entity +public class EcEnumPerson { + + enum Tags { + RED, + BLUE, + GREEN + } + + @Id + long id; + + String name; + + @ElementCollection + Set tags = new LinkedHashSet<>(); + + @Version + long version; + + public EcEnumPerson(String name) { + this.name = name; + } + + @Override + public String toString() { + return "person id:" + id + " name:" + name + " tags:" + tags; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getTags() { + return tags; + } + + public void setTags(Set tags) { + this.tags = tags; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } +} diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionEnumSet.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEnumSet.java new file mode 100644 index 000000000..988097da5 --- /dev/null +++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionEnumSet.java @@ -0,0 +1,33 @@ +package org.tests.model.elementcollection; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestElementCollectionEnumSet extends BaseTestCase { + + @Test + public void test() { + + EcEnumPerson person = new EcEnumPerson("Enum Person"); + person.getTags().add(EcEnumPerson.Tags.BLUE); + person.getTags().add(EcEnumPerson.Tags.RED); + + Ebean.save(person); + + + EcEnumPerson one = Ebean.find(EcEnumPerson.class) + .setId(person.getId()) + .fetch("tags") + .findOne(); + + assertThat(one.getTags()).hasSize(2); + + one.getTags().add(EcEnumPerson.Tags.GREEN); + one.getTags().remove(EcEnumPerson.Tags.BLUE); + + Ebean.save(one); + } +}