diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMetaFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMetaFactory.java index af6e7b9e4..5def0dc64 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMetaFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanEmbeddedMetaFactory.java @@ -42,11 +42,7 @@ class BeanEmbeddedMetaFactory { int dbScale = dbScale(column, sourceProperties[i]); String colDefn = getDbColumnDefn(column, sourceProperties[i]); BeanPropertyOverride overrides = new BeanPropertyOverride(dbColumn, dbNullable, dbLength, dbScale, colDefn); - if (sourceProperties[i] instanceof BeanPropertyAssocOne) { - embeddedProperties[i] = new BeanPropertyAssocOne((BeanPropertyAssocOne)sourceProperties[i], overrides); - } else { - embeddedProperties[i] = new BeanProperty(sourceProperties[i], overrides); - } + embeddedProperties[i] = sourceProperties[i].override(overrides); } return new BeanEmbeddedMeta(embeddedProperties); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java index d564a1f7a..ad054c59b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java @@ -365,13 +365,14 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty { return InternString.intern(s); } + public BeanProperty override(BeanPropertyOverride override) { + return new BeanProperty(this, override); + } + /** - * Create a Matching BeanProperty with some attributes overridden. - *

- * Primarily for supporting Embedded beans with overridden dbColumn - * mappings. + * Create a Matching BeanProperty with some attributes overridden for Embedded beans. */ - public BeanProperty(BeanProperty source, BeanPropertyOverride override) { + protected BeanProperty(BeanProperty source, BeanPropertyOverride override) { this.descriptor = source.descriptor; this.propertyIndex = source.propertyIndex; this.name = source.getName(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java index ca81267eb..9a69b8c9c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java @@ -94,10 +94,12 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } } - /** - * Copy constructor for ManyToOne inside Embeddable. - */ - public BeanPropertyAssocOne(BeanPropertyAssocOne source, BeanPropertyOverride override) { + @Override + public BeanPropertyAssocOne override(BeanPropertyOverride override) { + return new BeanPropertyAssocOne<>(this, override); + } + + protected BeanPropertyAssocOne(BeanPropertyAssocOne source, BeanPropertyOverride override) { super(source, override); primaryKeyExport = source.primaryKeyExport; primaryKeyJoin = source.primaryKeyJoin; @@ -255,12 +257,8 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr } private SqlUpdate deleteByParentIdList(List parentIds) { - - StringBuilder sb = new StringBuilder(100); - sb.append(deleteByParentIdInSql); - sb.append(targetIdBinder.getIdInValueExpr(false, parentIds.size())); - - DefaultSqlUpdate delete = new DefaultSqlUpdate(sb.toString()); + String sql = deleteByParentIdInSql + targetIdBinder.getIdInValueExpr(false, parentIds.size()); + DefaultSqlUpdate delete = new DefaultSqlUpdate(sql); bindParentIds(delete, parentIds); return delete; } @@ -501,7 +499,7 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr return targetDescriptor.getIdProperty(); } - ScalarType getIdScalarType() { + ScalarType getIdScalarType() { return targetDescriptor.getIdProperty().scalarType; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java index 0b7cdebbc..bc13b1a8b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyJsonMapper.java @@ -27,6 +27,16 @@ public class BeanPropertyJsonMapper extends BeanProperty { this.sourceDetection = deployProp.getMutationDetection() == MutationDetection.SOURCE; } + private BeanPropertyJsonMapper(BeanPropertyJsonMapper source, BeanPropertyOverride override) { + super(source, override); + this.sourceDetection = source.sourceDetection; + } + + @Override + public BeanProperty override(BeanPropertyOverride override) { + return new BeanPropertyJsonMapper(this, override); + } + @Override public MutableValueInfo createMutableInfo(String json) { if (sourceDetection) { diff --git a/ebean-core/src/test/java/org/tests/model/embedded/EAddress.java b/ebean-core/src/test/java/org/tests/model/embedded/EAddress.java index 86911152b..356399005 100644 --- a/ebean-core/src/test/java/org/tests/model/embedded/EAddress.java +++ b/ebean-core/src/test/java/org/tests/model/embedded/EAddress.java @@ -1,5 +1,8 @@ package org.tests.model.embedded; +import io.ebean.annotation.DbJson; +import org.tests.model.json.PlainBean; + import javax.persistence.Column; import javax.persistence.Embeddable; import javax.persistence.EnumType; @@ -18,6 +21,9 @@ public class EAddress { @Enumerated(EnumType.STRING) EAddressStatus status; + @DbJson + PlainBean jbean; + public String getStreet() { return street; } @@ -42,6 +48,14 @@ public class EAddress { this.city = city; } + public PlainBean getJbean() { + return jbean; + } + + public void setJbean(PlainBean jbean) { + this.jbean = jbean; + } + public EAddressStatus getStatus() { return status; } diff --git a/ebean-core/src/test/java/org/tests/model/embedded/EPerson.java b/ebean-core/src/test/java/org/tests/model/embedded/EPerson.java index 1e85b1041..8a0c60446 100644 --- a/ebean-core/src/test/java/org/tests/model/embedded/EPerson.java +++ b/ebean-core/src/test/java/org/tests/model/embedded/EPerson.java @@ -24,7 +24,8 @@ public class EPerson { @Embedded @AttributeOverrides({ @AttributeOverride(name = "city", column = @Column(name = "addr_city")), - @AttributeOverride(name = "status", column = @Column(name = "addr_status")) + @AttributeOverride(name = "status", column = @Column(name = "addr_status")), + @AttributeOverride(name = "jbean", column = @Column(name = "addr_jbean")) }) EAddress address; diff --git a/ebean-core/src/test/java/org/tests/rawsql/nativesql/TestNativeWithEmbedded.java b/ebean-core/src/test/java/org/tests/rawsql/nativesql/TestNativeWithEmbedded.java index b6e4287a0..09084ccc2 100644 --- a/ebean-core/src/test/java/org/tests/rawsql/nativesql/TestNativeWithEmbedded.java +++ b/ebean-core/src/test/java/org/tests/rawsql/nativesql/TestNativeWithEmbedded.java @@ -1,12 +1,13 @@ package org.tests.rawsql.nativesql; import io.ebean.BaseTestCase; -import io.ebean.Ebean; +import io.ebean.DB; import io.ebean.Query; import org.ebeantest.LoggedSqlCollector; import org.junit.Test; import org.tests.model.embedded.EAddress; import org.tests.model.embedded.EPerson; +import org.tests.model.json.PlainBean; import java.util.List; @@ -22,20 +23,22 @@ public class TestNativeWithEmbedded extends BaseTestCase { EAddress address = new EAddress(); address.setStreet("1 foo st"); address.setCity("barv"); + address.setJbean(new PlainBean("hi", 3)); person.setAddress(address); - Ebean.save(person); + DB.save(person); - String sql = "select id, name, street, suburb, addr_city, addr_status from eperson where id = ?"; + String sql = "select id, name, street, suburb, addr_city, addr_status, addr_jbean from eperson where id = ?"; LoggedSqlCollector.start(); - Query query = Ebean.findNative(EPerson.class, sql); + Query query = DB.findNative(EPerson.class, sql); query.setParameter(person.getId()); EPerson one = query.findOne(); assertThat(one.getName()).isEqualTo("Frank"); assertThat(one.getAddress().getStreet()).isEqualTo("1 foo st"); + assertThat(one.getAddress().getJbean().getName()).isEqualTo("hi"); List loggedSql = LoggedSqlCollector.stop(); assertThat(loggedSql).hasSize(1);