#469 - Embedded bean made dirty after a prior insert does not trigger dirty state on 'outer' bean

This commit is contained in:
Robin Bygrave
2015-11-27 18:19:59 +13:00
parent a578eda2b1
commit 6450ba219c
4 changed files with 49 additions and 4 deletions
@@ -691,6 +691,7 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
for (int i = 0; i < len; i++) {
intercept.setLoadedProperty(i);
}
beanDescriptor.setEmbeddedOwner(entityBean);
}
public boolean isReference() {
@@ -2051,6 +2051,15 @@ public class BeanDescriptor<T> implements MetaBeanInfo, SpiBeanType<T> {
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;
}
@@ -578,17 +578,30 @@ public class BeanPropertyAssocOne<T> extends BeanPropertyAssoc<T> {
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);
}
}
@@ -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);
}
}