我使用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);
}
});