mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
Fix for #83 - Bug: Stateless update cascading to OneToOne or ManyToOne incorrectly tries to INSERT rather than UPDATE
This commit is contained in:
@@ -2300,7 +2300,6 @@ public class BeanDescriptor<T> implements MetaBeanInfo {
|
||||
if (beanState == null) {
|
||||
return null;
|
||||
} else {
|
||||
beanState.setLoadedState();
|
||||
return (T) beanState.getBean();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -847,9 +847,7 @@ public class BeanPropertyAssocMany<T> extends BeanPropertyAssoc<T> {
|
||||
childMasterProperty.setValue(detailBean, bean);
|
||||
detailBeanState.setLoaded(childMasterProperty.getName());
|
||||
}
|
||||
|
||||
detailBeanState.setLoadedState();
|
||||
|
||||
|
||||
if (!ctx.readArrayNext()){
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -161,12 +161,6 @@ public class ReadJsonContext extends ReadBasicJsonContext {
|
||||
}
|
||||
}
|
||||
|
||||
public void setLoadedState(){
|
||||
if (ebi != null){
|
||||
ebi.setLoaded();
|
||||
}
|
||||
}
|
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
String propName = evt.getPropertyName();
|
||||
loadedProps.add(propName);
|
||||
|
||||
+3
-5
@@ -26,15 +26,13 @@ public class TestReferenceWithConstructorProperties extends BaseTestCase {
|
||||
Set<String> loadedProps = beanState.getLoadedProps();
|
||||
|
||||
Assert.assertEquals(1, loadedProps.size());
|
||||
Assert.assertTrue(beanState.isReference());
|
||||
|
||||
// read the status invokes lazy loading
|
||||
order.getStatus();
|
||||
|
||||
BeanState beanState2 = Ebean.getBeanState(order);
|
||||
// fully loaded
|
||||
Assert.assertNull(beanState2.getLoadedProps());
|
||||
|
||||
|
||||
Assert.assertFalse(beanState.isReference());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -46,8 +46,17 @@ public class TestTextJsonReferenceBean extends BaseTestCase {
|
||||
EntityBean eb = (EntityBean)refProd;
|
||||
prodDesc.isReference(eb._ebean_getIntercept());
|
||||
|
||||
BeanState beanState = Ebean.getBeanState(refProd);
|
||||
Assert.assertTrue(beanState.isNew());
|
||||
|
||||
String name = refProd.getName();
|
||||
Assert.assertNotNull(name);
|
||||
Assert.assertNull(name);
|
||||
|
||||
// Set to be 'loaded' to invoke lazy loading
|
||||
beanState.setLoaded();
|
||||
String name2 = refProd.getName();
|
||||
Assert.assertNotNull(name2);
|
||||
|
||||
}
|
||||
|
||||
List<Order> orders = Ebean.find(Order.class)
|
||||
|
||||
@@ -47,21 +47,15 @@ public class TestJsonStatelessUpdate extends BaseTestCase {
|
||||
// The update below cascades to also save "master" and that fails
|
||||
// as it thinks it should INSERT master rather than UPDATE master
|
||||
|
||||
// Ebean.update(two2);
|
||||
Ebean.update(two2);
|
||||
|
||||
|
||||
// The following is a workaround, to explicitly update master first
|
||||
// so then Ebean doesn't try to save it when two2 is updated
|
||||
Ebean.beginTransaction();
|
||||
try {
|
||||
UUOne master = two2.getMaster();
|
||||
Ebean.update(master);
|
||||
Ebean.update(two2);
|
||||
|
||||
} finally {
|
||||
Ebean.endTransaction();
|
||||
}
|
||||
|
||||
|
||||
// confirm the properties where updated as expected
|
||||
UUTwo twoConfirm = Ebean.find(UUTwo.class, two.getId());
|
||||
|
||||
Assert.assertEquals("twoNameModified", twoConfirm.getName());
|
||||
Assert.assertEquals("oneNameModified", twoConfirm.getMaster().getName());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user