#482 - ENH: @Draftable - Save or update is not allowed on a 'live' bean - only draft beans ... add this check when @Draft property is used

This commit is contained in:
Robin Bygrave
2015-12-07 12:09:10 +13:00
parent ff8e5af4e5
commit f42be3d65a
3 changed files with 24 additions and 0 deletions
@@ -21,6 +21,7 @@ import com.avaje.ebeaninternal.server.persist.PersistExecute;
import com.avaje.ebeaninternal.server.transaction.BeanPersistIdMap;
import javax.persistence.OptimisticLockException;
import javax.persistence.PersistenceException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -436,6 +437,16 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
return beanDescriptor.isDraftable();
}
/**
* Checks for @Draftable entity beans with @Draft property that the bean is a 'draft'.
* Save or Update is not allowed to execute using 'live' beans - must use publish().
*/
public void checkDraft() {
if (beanDescriptor.isDraftable() && !beanDescriptor.isDraftInstance(entityBean)) {
throw new PersistenceException("Save or update is not allowed on a 'live' bean - only draft beans");
}
}
/**
* Return the parent bean for cascading save with unidirectional relationship.
*/
@@ -827,4 +838,5 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
public boolean isSoftDelete() {
return Type.SOFT_DELETE == type;
}
}
@@ -2002,6 +2002,17 @@ public class BeanDescriptor<T> implements MetaBeanInfo, SpiBeanType<T> {
}
}
/**
* Return true if the bean is considered a 'draft' instance.
*/
public boolean isDraftInstance(EntityBean entityBean) {
if (draft != null) {
return Boolean.TRUE == draft.getValue(entityBean);
}
// no draft property - so just ignore the check / return true
return true;
}
/**
* If there is a @DraftDirty property set it's value on the bean.
*/
@@ -354,6 +354,7 @@ public final class DefaultPersister implements Persister {
PersistRequestBean<?> req = createRequest(entityBean, t, PersistRequest.Type.UPDATE);
req.setDeleteMissingChildren(deleteMissingChildren);
req.checkDraft();
try {
req.initTransIfRequiredWithBatchCascade();
if (req.isReference()) {