首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Hibernate从数据库中删除实体和关系

使用Hibernate从数据库中删除实体和关系
EN

Stack Overflow用户
提问于 2021-02-24 23:51:40
回答 1查看 44关注 0票数 0

我试图为我的问题找到一个解决方案,但幸运地离开了我。说到点子上。

代码语言:javascript
复制
 @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。在我的服务中,我这样做:

代码语言:javascript
复制
@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);

    }

候选存储库定义为:

代码语言:javascript
复制
public interface CandidateRepository extends JpaRepository<Candidate, Long>

RestController调用:

代码语言:javascript
复制
@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时:

代码语言:javascript
复制
"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 

我发现我在迭代时删除了,所以我得到了这个错误。在我提到的文章中,没有这样的错误。有人能告诉我我哪里做错了吗?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-02-25 00:29:38

如果要清空集合,可以将其设为HashSet<>();如果要删除每个技能,可以获取集合的副本,清空候选技能,之后,可以删除副本中的每个技能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66354297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档