diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java index 27e2161ebc..e429fce18f 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java @@ -2149,8 +2149,14 @@ protected void flush(int reason) { // dependents _flags |= FLAG_DEREFDELETING; if (flush && _derefCache != null && !_derefCache.isEmpty()) { - for (Iterator itr = _derefCache.iterator(); itr.hasNext();) - deleteDeref(itr.next()); + Set statesMarkedForDelete = new HashSet<>(); + // mark for delete all elements in deref, otherwise in some situations it + // throws ConcurrentModificationException + statesMarkedForDelete.addAll(_derefCache); + for (StateManagerImpl state: statesMarkedForDelete) { + deleteDeref(state); + } + flushAdditions(transactional, reason); }