我有一段代码,它基本上可以滚动列表,比较对象(维度(是否存在于列表中并将其删除。这样我就删除了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);
}