Java迭代集合在Save之后抛出ConcurrentModificationException



我使用Hibernate将对象保存到DB。我有一个Parent对象和它下面的一组子对象。在迭代子对象时,如果特定的条件匹配,那么我使用ApplicationEventPublisher发布一个事件,这个事件是单独处理的,这增加了一些额外的逻辑并保存了对象。控件从事件处理程序返回后,将抛出java.util.ConcurrentModificationException

以下是代码:

parent.getChild().forEach(child -> {
if (child.getStatus().equals("PENDING")) {
applicationEventPublisher.publishEvent(new NewEvent(child));
publishLifeCycleEvent(deal);
}
}
});

有一个事件侦听器:

@EventListener
public void saveChildEvent(NewEvent childEvent) {
Child child = childEvent.getChild();
//...do processing
childRepository.save(child);
}

但此时它抛出java.util.ConcurrentModificationException。我该如何纠正?

Stack Trace -
java.util.ConcurrentModificationException: null
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)
at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516)
at org.hibernate.collection.internal.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:893)
at java.base/java.lang.Iterable.forEach(Iterable.java:74)

您可以迭代列表的副本,如下所示:

var children = new ArrayList<>(parent.getChild());
children .forEach(child -> {
if (child.getStatus().equals("PENDING")) {
applicationEventPublisher.publishEvent(new NewEvent(child));
publishLifeCycleEvent(deal);
}
});

最新更新