diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java index ae466210d..125ab1d98 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java @@ -764,7 +764,14 @@ public final class DefaultPersister implements Persister { // increase depth for batching order t.depth(+1); for (Object removedBean : modifyRemovals) { - deleteRecurse(removedBean, t); + if (removedBean instanceof EntityBean) { + EntityBean eb = (EntityBean)removedBean; + if (eb._ebean_getIntercept().isLoaded()) { + // only delete if the bean was loaded meaning that + // it is know to exist in the DB + deleteRecurse(removedBean, t); + } + } } t.depth(-1); } diff --git a/src/test/java/com/avaje/tests/cascade/TestPrivateOwnedIgnoreTransientOrphan.java b/src/test/java/com/avaje/tests/cascade/TestPrivateOwnedIgnoreTransientOrphan.java index 905198d92..ed94dac43 100644 --- a/src/test/java/com/avaje/tests/cascade/TestPrivateOwnedIgnoreTransientOrphan.java +++ b/src/test/java/com/avaje/tests/cascade/TestPrivateOwnedIgnoreTransientOrphan.java @@ -29,12 +29,14 @@ public class TestPrivateOwnedIgnoreTransientOrphan extends BaseTestCase { master1 = Ebean.find(master0.getClass(), master0.getId()); + // Add then remove a bean that was never saved (to the DB) master1.getDetails().add(new TSDetail()); master1.getDetails().clear(); try{ Ebean.save(master1); } catch (OptimisticLockException exception) { + // Occured when the "unsaved" bean was wrongly being deleted Assert.fail("Optimistic lock exception wrongly thrown: " + exception.getMessage()); return; }