我试图为我的问题找到一个解决方案,但幸运地离开了我。说到点子上。
@Entity
@Table(name = "candidates")
public class Candidate extends AbstractEntityID {
private String name;
private LocalDate dateOfBirth;
private String contactNumber;
private String email;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinTable(name = "possess", joinColumns = {@JoinColumn(name = "candidate_id")},
inverseJoinColumns = {@JoinColumn(name = "skill_id")})
private Set<Skill> skills = new HashSet<>();
public Set<Skill> getSkills() {
return skills;
}
public void addSkills(Skill skill) {
skills.add(skill);
skill.getCandidates().add(this);
}
@Entity
@Table(name = "skill")
public class Skill extends AbstractEntityID {
private String skillName;
@ManyToMany(mappedBy = "skills",cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
private Set<Candidate> candidates = new HashSet<>();
public Set<Candidate> getCandidates() {
return candidates;
}
public void setCandidates(Set<Candidate> candidates) {
this.candidates = candidates;
}为简单起见,省略了Get/Set和构造函数。一个表候选人包含候选人的简单数据,表技能是存储编程技能的表。Join表具有代表candidateA (具有id=1)技能的链接: java (id=1)、C++(id=2)等等。Join表被填充:(1,1),(1,2)-> candidateA具有java和C++技能。现在我想从候选表中删除candidateA。首先,我必须删除与技能的连接,然后再删除它。在这里可以找到不错的教程:JPA and Hibernate Relations。在我的服务中,我这样做:
@Override
public void delete(Long id) {
// find candidate
Candidate candidate = candidateRepository.getOne(id);
// remove connections
candidate.getSkills().forEach(skill -> candidate.getSkills().remove(skill));
// remove candidate
candidateRepository.deleteById(id);
}候选存储库定义为:
public interface CandidateRepository extends JpaRepository<Candidate, Long>RestController调用:
@DeleteMapping(value = "/{id}")
@ApiOperation(value = "This option deletes candidate from database")
public ResponseEntity<Void> deleteCandidate(@PathVariable Long id){
candidateService.delete(id);
return ResponseEntity.noContent().build();
}当我运行我的应用程序并尝试删除候选人got时:
"status": 500,
"error": "Internal Server Error",
"trace": "java.util.ConcurrentModificationException\r\n\tat java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)\r\n\tat java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516)\r\n\tat 我发现我在迭代时删除了,所以我得到了这个错误。在我提到的文章中,没有这样的错误。有人能告诉我我哪里做错了吗?谢谢。
发布于 2021-02-25 00:29:38
如果要清空集合,可以将其设为HashSet<>();如果要删除每个技能,可以获取集合的副本,清空候选技能,之后,可以删除副本中的每个技能。
https://stackoverflow.com/questions/66354297
复制相似问题