java.util.ConcurrentModificationException:试图删除行时为null



我有一段代码,它基本上可以滚动列表,比较对象(维度(是否存在于列表中并将其删除。这样我就删除了threadId_dimensionId表中的关系。

public void unlink(String threatId, String dimensionId) {
log.info("Trying to delete the relationship of Threat id: {} with dimension id: {}", threatId, dimensionId);
Threat threat = threatService.findById(threatId);
Dimension dimension = dimensionService.findById(dimensionId);
threat.getDimensions().forEach(f -> {
if (f.getId().equals(dimension.getId())) {
threat.getDimensions().removeIf(e -> f.equals(dimension));
threatRepository.saveAndFlush(threat);
}
});
}

问题是,当我删除它时,它会抛出以下异常:java.util.ConcurrentModificationException:null请注意,尽管存在异常,但该关系仍将被删除。

关于如何避免这个错误,有什么建议吗?

Essa sao minhas类

威胁

@ManyToMany(cascade = {
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.REFRESH,
CascadeType.PERSIST
}, fetch = FetchType.EAGER)
@JoinTable(name = "threat_dimension", joinColumns = {
@JoinColumn(name = "threat_id")}, inverseJoinColumns = {
@JoinColumn(name = "dimension_id")})
private List<Dimension> dimensions;

和尺寸

@OnDelete(action = OnDeleteAction.CASCADE)
@ManyToMany(mappedBy = "dimensions", fetch = FetchType.EAGER)
private List<Threat> threats;

我感谢你的帮助!

一般来说,在迭代集合时不能同时修改它。此外,您的lambda看起来有点时髦。对getDimensions()进行两次迭代,但从不使用内部lambda参数。每次迭代总是保存和刷新听起来像是一个性能瓶颈,因为它会创建太多查询。

修改集合一次,然后保存您的实体(通常在交易结束时自动完成(就足够了:

public void unlink(String threatId, String dimensionId) {
log.info("Trying to delete the relationship of Threat id: {} with dimension id: {}", threatId, dimensionId);
Threat threat = threatService.findById(threatId);
Dimension dimension = dimensionService.findById(dimensionId);
// mutate collection by removing items:
threat.getDimensions().removeIf(dim -> dim.getId().equals(dimension.getId()));
threatRepository.saveAndFlush(threat);
}

最新更新