#2127 - Fix for - Adding a new list of children to @OneToMany with orphanRemoval true does not delete existing orphans

Modifies EntityBeanIntercept preSetterMany to set the changed state on the many property and use this in SaveManyBeans to detect when the existing beans need orphan removal
This commit is contained in:
Robin Bygrave committed 2021-02-04 15:45:19 +13:00
1 parent dd080c5933
commit d57657c209
4 files changed
+79 -20

No files matched your search

@@ -9,6 +9,7 @@ import org.junit.Test;
import org.tests.model.basic.Customer;
import org.tests.model.basic.ResetBasicData;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@@ -70,4 +71,67 @@ public class TestBeanState extends BaseTestCase {
beanState.setDisableLazyLoad(true);
assertNull(customer.getName());
}
@Test
public void getChangedProps_when_setManyProperty() {
ResetBasicData.reset();
Customer customer = DB.find(Customer.class).order("id").setMaxRows(1).findOne();
BeanState beanState = DB.getBeanState(customer);
assertThat(beanState.getChangedProps()).isEmpty();
customer.setContacts(new ArrayList<>());
assertThat(beanState.getChangedProps()).containsOnly("contacts");
}
@Test
public void getChangedProps_when_setManyProperty_onNewBean() {
Customer customer = new Customer();
BeanState beanState = DB.getBeanState(customer);
assertThat(beanState.getChangedProps()).isEmpty();
// when new state, then loaded
customer.setContacts(new ArrayList<>());
assertThat(beanState.getChangedProps()).isEmpty();
assertThat(beanState.getLoadedProps()).containsOnly("contacts");
// set loaded state, then marked as changed
beanState.setLoaded();
customer.setContacts(new ArrayList<>());
assertThat(beanState.getLoadedProps()).containsOnly("contacts");
assertThat(beanState.getChangedProps()).containsOnly("contacts");
}
@Test(expected = IllegalStateException.class)
public void readOnly_when_setManyProperty() {
Customer customer = new Customer();
customer.setContacts(new ArrayList<>());
BeanState beanState = DB.getBeanState(customer);
beanState.setLoaded();
beanState.setReadOnly(true);
// act, try to mutate read only bean
customer.setContacts(new ArrayList<>());
}
@Test(expected = IllegalStateException.class)
public void readOnly_when_setProperty() {
Customer customer = new Customer();
customer.setName("a");
BeanState beanState = DB.getBeanState(customer);
beanState.setLoaded();
beanState.setReadOnly(true);
// act, try to mutate read only bean
customer.setName("b");
}
}
@@ -19,8 +19,7 @@ public class TestDeleteO2MOrphans extends BaseTestCase {
// assert
COOne check = findById(id);
//FIXME #2127 #2141: assertThat(check.getChildren()).hasSize(2);
assertThat(check.getChildren()).hasSize(4);
assertThat(check.getChildren()).hasSize(2);
DB.delete(check);
}