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 06ff2122d..1914051aa 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java @@ -32,6 +32,7 @@ import javax.persistence.ElementCollection; import javax.persistence.EnumType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; +import javax.persistence.Lob; import javax.persistence.ManyToMany; import javax.persistence.MapKey; import javax.persistence.MapKeyColumn; @@ -271,6 +272,10 @@ class AnnotationAssocManys extends AnnotationParser { valueProp.setDbLength(column.length()); valueProp.setDbScale(column.scale()); } + Lob lob = get(prop, Lob.class); + if (lob != null) { + util.setLobType(valueProp); + } elementDescriptor.addBeanProperty(valueProp); } diff --git a/src/test/java/org/tests/model/elementcollection/EcmcPerson.java b/src/test/java/org/tests/model/elementcollection/EcmcPerson.java new file mode 100644 index 000000000..fe7d326e6 --- /dev/null +++ b/src/test/java/org/tests/model/elementcollection/EcmcPerson.java @@ -0,0 +1,71 @@ +package org.tests.model.elementcollection; + +import io.ebean.annotation.Cache; + +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.MapKeyColumn; +import javax.persistence.Version; +import java.util.LinkedHashMap; +import java.util.Map; + +@Cache +@Entity +public class EcmcPerson { + + @Id + long id; + + String name; + + @ElementCollection + @MapKeyColumn(name = "type", length = 4) + @Lob + Map phoneNumbers = new LinkedHashMap<>(); + + @Version + long version; + + public EcmcPerson(String name) { + this.name = name; + } + + @Override + public String toString() { + return "person id:" + id + " name:" + name + " phs:" + phoneNumbers; + } + + 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 Map getPhoneNumbers() { + return phoneNumbers; + } + + public void setPhoneNumbers(Map phoneNumbers) { + this.phoneNumbers = phoneNumbers; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } +} diff --git a/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapAsLob.java b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapAsLob.java new file mode 100644 index 000000000..60e140434 --- /dev/null +++ b/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicMapAsLob.java @@ -0,0 +1,39 @@ +package org.tests.model.elementcollection; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestElementCollectionBasicMapAsLob extends BaseTestCase { + + @Test + public void test() { + + LoggedSqlCollector.start(); + + EcmcPerson person = new EcmcPerson("Lob021"); + person.getPhoneNumbers().put("home", "021 1234"); + person.getPhoneNumbers().put("work", "021 4321"); + Ebean.save(person); + + List sql = LoggedSqlCollector.current(); + if (isPersistBatchOnCascade()) { + assertThat(sql).hasSize(2); + assertThat(sql.get(0)).contains("insert into ecmc_person"); + assertThat(sql.get(1)).contains("insert into ecmc_person_phone"); + } else { + assertThat(sql).hasSize(3); + assertThat(sql.get(0)).contains("insert into ecmc_person"); + assertThat(sql.get(1)).contains("insert into ecmc_person_phone"); + assertThat(sql.get(2)).contains("insert into ecmc_person_phone"); + } + + LoggedSqlCollector.stop(); + } + +}