mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
#1833 - When cascade persisting twice to ElementCollection ... we get do extra delete and inserts
This commit is contained in:
@@ -75,9 +75,10 @@ public interface SpiTransaction extends Transaction {
|
||||
boolean isRegisteredDeleteBean(Integer hash);
|
||||
|
||||
/**
|
||||
* Unregister the persisted bean.
|
||||
* Unregister the persisted beans. Expected after persisting top level beans
|
||||
* and hence including all beans that were cascade persisted.
|
||||
*/
|
||||
void unregisterBean(Object bean);
|
||||
void unregisterBeans();
|
||||
|
||||
/**
|
||||
* Return true if this is a bean that has already been persisted in the
|
||||
|
||||
@@ -189,8 +189,8 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregisterBean(Object bean) {
|
||||
transaction.unregisterBean(bean);
|
||||
public void unregisterBeans() {
|
||||
transaction.unregisterBeans();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -83,6 +83,8 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
|
||||
|
||||
private int flags;
|
||||
|
||||
private boolean saveRecurse;
|
||||
|
||||
private DocStoreMode docStoreMode;
|
||||
|
||||
private final ConcurrencyMode concurrencyMode;
|
||||
@@ -529,8 +531,6 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
|
||||
public void addToQueue(DocStoreUpdates docStoreUpdates) {
|
||||
switch (type) {
|
||||
case INSERT:
|
||||
docStoreUpdates.queueIndex(beanDescriptor.getDocStoreQueueId(), idValue);
|
||||
break;
|
||||
case UPDATE:
|
||||
case DELETE_SOFT:
|
||||
docStoreUpdates.queueIndex(beanDescriptor.getDocStoreQueueId(), idValue);
|
||||
@@ -585,7 +585,10 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
|
||||
}
|
||||
|
||||
public void unRegisterBean() {
|
||||
transaction.unregisterBean(bean);
|
||||
if (!saveRecurse) {
|
||||
// only clear all persisted beans when persisting at the top level
|
||||
transaction.unregisterBeans();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1464,4 +1467,11 @@ public final class PersistRequestBean<T> extends PersistRequest implements BeanP
|
||||
public boolean isForcedUpdate() {
|
||||
return Flags.isUpdateForce(flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set when this request is from cascading persist.
|
||||
*/
|
||||
public void setSaveRecurse() {
|
||||
saveRecurse = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -473,6 +473,7 @@ public final class DefaultPersister implements Persister {
|
||||
}
|
||||
|
||||
private void saveRecurse(PersistRequestBean<?> request) {
|
||||
request.setSaveRecurse();
|
||||
if (request.isReference()) {
|
||||
// its a reference...
|
||||
if (request.isPersistCascade()) {
|
||||
|
||||
@@ -201,7 +201,7 @@ class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCode
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregisterBean(Object bean) {
|
||||
public void unregisterBeans() {
|
||||
throw new IllegalStateException(notExpectedMessage);
|
||||
}
|
||||
|
||||
@@ -280,7 +280,6 @@ class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCode
|
||||
|
||||
@Override
|
||||
public void setBatchMode(boolean batchMode) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -446,11 +446,11 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes {
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister the persisted bean.
|
||||
* Unregister the persisted beans (when persisting at the top level).
|
||||
*/
|
||||
@Override
|
||||
public void unregisterBean(Object bean) {
|
||||
persistingBeans.remove(bean);
|
||||
public void unregisterBeans() {
|
||||
persistingBeans.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -129,8 +129,7 @@ class NoTransaction implements SpiTransaction {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregisterBean(Object bean) {
|
||||
|
||||
public void unregisterBeans() {
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -160,7 +159,6 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void register(TransactionCallback callback) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -170,12 +168,10 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void setReadOnly(boolean readOnly) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRollbackOnly() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -186,27 +182,22 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void setDocStoreMode(DocStoreMode mode) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDocStoreBatchSize(int batchSize) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPersistCascade(boolean persistCascade) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUpdateAllLoadedProperties(boolean updateAllLoadedProperties) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSkipCache(boolean skipCache) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -216,7 +207,6 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void setBatchMode(boolean useBatch) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -235,7 +225,6 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void setBatchSize(int batchSize) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -245,17 +234,14 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void setBatchGetGeneratedKeys(boolean getGeneratedKeys) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBatchFlushOnMixed(boolean batchFlushOnMixed) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBatchFlushOnQuery(boolean batchFlushOnQuery) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -265,12 +251,10 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void flush() throws PersistenceException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flushBatch() throws PersistenceException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -280,12 +264,10 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void addModification(String tableName, boolean inserts, boolean updates, boolean deletes) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putUserObject(String name, Object value) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -300,7 +282,6 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void depth(int diff) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -335,7 +316,6 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void setBatchControl(BatchControl control) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -345,7 +325,6 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void setPersistenceContext(PersistenceContext context) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -365,12 +344,10 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void flushBatchOnCascade() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flushBatchOnRollback() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -380,27 +357,22 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void markNotQueryOnly() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkBatchEscalationOnCollection() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flushBatchOnCollection() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addBeanChange(BeanChange beanChange) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendChangeLog(ChangeSet changeSet) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -410,7 +382,6 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void setTenantId(Object tenantId) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -425,12 +396,10 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void profileEvent(SpiProfileTransactionEvent event) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProfileStream(ProfileStream profileStream) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -440,7 +409,6 @@ class NoTransaction implements SpiTransaction {
|
||||
|
||||
@Override
|
||||
public void setProfileLocation(ProfileLocation profileLocation) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user