hibernate Java迭代集合在保存后引发ConcurentModificationException

bvpmtnay  于 2022-11-14  发布在  Java
关注(0)|答案(1)|浏览(152)

我正在使用Hibernate将对象保存到数据库中。我在它下面有一个父对象和一组子对象。在对子对象进行迭代时,如果匹配特定的条件,则使用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.ConcurentModificationException异常。我如何才能纠正这一点呢?

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)
6jygbczu

6jygbczu1#

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

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

相关问题