From 100d314e630b79eb2a87140337db289dd99d0757 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Mon, 19 Jun 2017 23:34:44 +1200 Subject: [PATCH] #1035 Update for - FIX: deleting and adding same bean in beanCollection leads to deletion in DB If use Modify mode we need to listen for both adds and removes to support sorting (can't rely on undoDelete() due to ordering) --- .../io/ebean/common/AbstractBeanCollection.java | 15 ++++----------- src/main/java/io/ebean/common/ModifyHolder.java | 8 ++++---- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/main/java/io/ebean/common/AbstractBeanCollection.java b/src/main/java/io/ebean/common/AbstractBeanCollection.java index 8f6e4bf2c..456993b6d 100644 --- a/src/main/java/io/ebean/common/AbstractBeanCollection.java +++ b/src/main/java/io/ebean/common/AbstractBeanCollection.java @@ -47,8 +47,7 @@ abstract class AbstractBeanCollection implements BeanCollection { protected ModifyHolder modifyHolder; protected ModifyListenMode modifyListenMode; - protected boolean modifyAddListening; - protected boolean modifyRemoveListening; + protected boolean modifyListening; /** @@ -148,9 +147,7 @@ abstract class AbstractBeanCollection implements BeanCollection { public void setModifyListening(ModifyListenMode mode) { this.modifyListenMode = mode; - this.modifyAddListening = ModifyListenMode.ALL.equals(mode); - this.modifyRemoveListening = modifyAddListening || ModifyListenMode.REMOVALS.equals(mode); - this.modifyListening = modifyRemoveListening || modifyAddListening; + this.modifyListening = mode != null && ModifyListenMode.NONE != mode; if (modifyListening) { // lose any existing modifications modifyHolder = null; @@ -173,19 +170,15 @@ abstract class AbstractBeanCollection implements BeanCollection { @Override public void modifyAddition(E bean) { - if (modifyAddListening) { + if (modifyListening) { getModifyHolder().modifyAddition(bean); - } else if (modifyRemoveListening) { - getModifyHolder().undoDeletion(bean); } } @Override public void modifyRemoval(Object bean) { - if (modifyRemoveListening) { + if (modifyListening) { getModifyHolder().modifyRemoval(bean); - } else if (modifyAddListening) { - getModifyHolder().undoAddition(bean); } } diff --git a/src/main/java/io/ebean/common/ModifyHolder.java b/src/main/java/io/ebean/common/ModifyHolder.java index e618ac0bc..1e4008c32 100644 --- a/src/main/java/io/ebean/common/ModifyHolder.java +++ b/src/main/java/io/ebean/common/ModifyHolder.java @@ -44,10 +44,10 @@ class ModifyHolder implements Serializable { } } - boolean undoDeletion(E bean) { + private boolean undoDeletion(E bean) { return (bean != null) && modifyDeletions.remove(bean); } - + void modifyAddition(E bean) { if (bean != null) { // If it is to delete then just remove the deletion @@ -58,10 +58,10 @@ class ModifyHolder implements Serializable { } } - boolean undoAddition(Object bean) { + private boolean undoAddition(Object bean) { return (bean != null) && modifyAdditions.remove(bean); } - + @SuppressWarnings("unchecked") void modifyRemoval(Object bean) { if (bean != null) {