From 1c6fa575f2101feea76b3447838ecac8cacadc51 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Tue, 9 Apr 2019 20:30:17 +1200 Subject: [PATCH] #1669 - When deleting complex object graphs, entities are deleted multiple times Fix by not unregistering the deleted bean hash in the transaction so that the skip occurs on other root level bean traversals (the delete of the 2nd master bean) --- src/main/java/io/ebeaninternal/api/SpiTransaction.java | 5 ----- .../java/io/ebeaninternal/api/SpiTransactionProxy.java | 5 ----- .../ebeaninternal/server/core/PersistRequestBean.java | 5 ----- .../ebeaninternal/server/persist/DefaultPersister.java | 1 - .../transaction/ImplicitReadOnlyTransaction.java | 5 ----- .../server/transaction/JdbcTransaction.java | 10 ---------- .../server/transaction/NoTransaction.java | 5 ----- 7 files changed, 36 deletions(-) diff --git a/src/main/java/io/ebeaninternal/api/SpiTransaction.java b/src/main/java/io/ebeaninternal/api/SpiTransaction.java index fc89b85f3..0882d88ba 100644 --- a/src/main/java/io/ebeaninternal/api/SpiTransaction.java +++ b/src/main/java/io/ebeaninternal/api/SpiTransaction.java @@ -69,11 +69,6 @@ public interface SpiTransaction extends Transaction { */ void registerDeleteBean(Integer hash); - /** - * Unregister the hash of the bean. - */ - void unregisterDeleteBean(Integer hash); - /** * Return true if this is a bean that has already been saved/deleted. */ diff --git a/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java b/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java index bac97a83a..be0246b30 100644 --- a/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java +++ b/src/main/java/io/ebeaninternal/api/SpiTransactionProxy.java @@ -183,11 +183,6 @@ public abstract class SpiTransactionProxy implements SpiTransaction { transaction.registerDeleteBean(hash); } - @Override - public void unregisterDeleteBean(Integer hash) { - transaction.unregisterDeleteBean(hash); - } - @Override public boolean isRegisteredDeleteBean(Integer hash) { return transaction.isRegisteredDeleteBean(hash); diff --git a/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index 9671d08cf..78c05e45e 100644 --- a/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -607,11 +607,6 @@ public final class PersistRequestBean extends PersistRequest implements BeanP transaction.registerDeleteBean(hash); } - public void unregisterDeleteBean() { - Integer hash = getBeanHash(); - transaction.unregisterDeleteBean(hash); - } - public boolean isRegisteredForDeleteBean() { if (transaction == null) { return false; diff --git a/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java b/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java index 9026e17d4..973bd04c0 100644 --- a/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java +++ b/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java @@ -882,7 +882,6 @@ public final class DefaultPersister implements Persister { // bean to handle bi-directional cascading request.registerDeleteBean(); deleteAssocMany(request); - request.unregisterDeleteBean(); unloadedForeignKeys = getDeleteUnloadedForeignKeys(request); if (unloadedForeignKeys != null) { diff --git a/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java index 907db2256..12c13870f 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java @@ -194,11 +194,6 @@ class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCode throw new IllegalStateException(notExpectedMessage); } - @Override - public void unregisterDeleteBean(Integer persistedBean) { - throw new IllegalStateException(notExpectedMessage); - } - /** * Return true if this is a bean that has already been saved/deleted. */ diff --git a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java index e38fb375b..eeb5bbf5b 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/JdbcTransaction.java @@ -436,16 +436,6 @@ public class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes { deletingBeansHash.add(persistingBean); } - /** - * Unregister the persisted bean. - */ - @Override - public void unregisterDeleteBean(Integer persistedBean) { - if (deletingBeansHash != null) { - deletingBeansHash.remove(persistedBean); - } - } - /** * Return true if this is a bean that has already been saved/deleted. */ diff --git a/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java index a13076e87..e357e5a79 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/NoTransaction.java @@ -123,11 +123,6 @@ class NoTransaction implements SpiTransaction { } - @Override - public void unregisterDeleteBean(Integer hash) { - - } - @Override public boolean isRegisteredDeleteBean(Integer hash) { return false;