diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestBean.java b/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestBean.java index 38082f626..324fee809 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestBean.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/PersistRequestBean.java @@ -691,6 +691,7 @@ public final class PersistRequestBean extends PersistRequest implements BeanP for (int i = 0; i < len; i++) { intercept.setLoadedProperty(i); } + beanDescriptor.setEmbeddedOwner(entityBean); } public boolean isReference() { diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java index abb9b245a..0c8149a6a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java @@ -2051,6 +2051,15 @@ public class BeanDescriptor implements MetaBeanInfo, SpiBeanType { return propertiesEmbedded; } + /** + * Set the embedded owner on any embedded bean properties. + */ + public void setEmbeddedOwner(EntityBean bean) { + for (int i = 0; i < propertiesEmbedded.length; i++) { + propertiesEmbedded[i].setEmbeddedOwner(bean); + } + } + public BeanProperty getIdProperty() { return idProperty; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java index d0de87896..d0c59f4d5 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java @@ -578,17 +578,30 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc { public void setValue(EntityBean bean, Object value) { super.setValue(bean, value); if (embedded && value instanceof EntityBean) { - EntityBean embedded = (EntityBean) value; - embedded._ebean_getIntercept().setEmbeddedOwner(bean, propertyIndex); + setEmbeddedOwner(bean, value); } } + /** + * Set the owner on the embedded bean property. + */ + public void setEmbeddedOwner(EntityBean owner) { + + Object emb = getValue(owner); + if (emb != null) { + setEmbeddedOwner(owner, emb); + } + } + + private void setEmbeddedOwner(EntityBean bean, Object value) { + ((EntityBean)value)._ebean_getIntercept().setEmbeddedOwner(bean, propertyIndex); + } + @Override public void setValueIntercept(EntityBean bean, Object value) { super.setValueIntercept(bean, value); if (embedded && value instanceof EntityBean) { - EntityBean embedded = (EntityBean) value; - embedded._ebean_getIntercept().setEmbeddedOwner(bean, propertyIndex); + setEmbeddedOwner(bean, value); } } diff --git a/src/test/java/com/avaje/tests/update/TestEmbeddedRefreshUpdate.java b/src/test/java/com/avaje/tests/update/TestEmbeddedRefreshUpdate.java index d078d3e1b..24e832ead 100644 --- a/src/test/java/com/avaje/tests/update/TestEmbeddedRefreshUpdate.java +++ b/src/test/java/com/avaje/tests/update/TestEmbeddedRefreshUpdate.java @@ -10,6 +10,8 @@ import com.avaje.tests.model.embedded.EEmbDatePeriod; import com.avaje.tests.model.embedded.EEmbInner; import com.avaje.tests.model.embedded.EEmbOuter; +import static org.assertj.core.api.Assertions.assertThat; + public class TestEmbeddedRefreshUpdate extends BaseTestCase { @Test @@ -39,4 +41,24 @@ public class TestEmbeddedRefreshUpdate extends BaseTestCase { Ebean.find(EEmbInner.class).fetch("outer").orderBy("outer.datePeriod.date1").findList(); } + + @Test + public void test2() { + + EEmbOuter outer = new EEmbOuter(); + outer.setNomeOuter("test"); + EEmbDatePeriod embeddedBean = new EEmbDatePeriod(); + embeddedBean.setDate1(new Date()); + outer.setDatePeriod(embeddedBean); + + Ebean.save(outer); + assertThat(outer.getUpdateCount()).isEqualTo(1); + + Date d = new Date(); + d.setTime(1L); + + outer.getDatePeriod().setDate1(d); + Ebean.save(outer); + assertThat(outer.getUpdateCount()).isEqualTo(2); + } }