【问题标题】:Why don't I get the response updated when I update the properties and send an updated request in spring boot?为什么我在 Spring Boot 中更新属性并发送更新请求时没有更新响应?
【发布时间】:2021-04-12 09:52:42
【问题描述】:

我正在使用 Angular、SpringBoot 和 PostgreSQL 开发一个 CRUD 应用程序。我在数据库中有两个名为“skills”和“employees”的表。通过连接“skills”和“employee”表创建的表是“employee_has”表。它们使用多对多关系映射。一个员工可以有很多技能。一项技能可以有很多员工。

在这里,当我创建具有技能的员工时,它会被正确创建。但是当我更新它并在前端提交后,技能不会更新。但是有效载荷正在发生我所做的更改。响应只有之前的技能列表。

这是我的请求负载。

{id: 12, name: "Testing", dob: "2021-04-08T18:30:00.000+00:00", email: "testing@abc.com",…}
dob: "2021-04-08T18:30:00.000+00:00"
email: "testing@abc.com"
id: 12
name: "Testing"
skills: ["SQL", "C", "C++"]
0: "SQL"
1: "C"
2: "C++"

这是我的回应。

{id: 12, name: "Testing", dob: "2021-04-08T18:30:00.000+00:00", email: "testing@abc.com", skills: Array(2)}
dob: "2021-04-08T18:30:00.000+00:00"
email: "testing@abc.com"
id: 12
name: "Testing"
skills: Array(2)
0: {id: 9, skill_name: "C"}
1: {id: 10, skill_name: "C++"}
length: 2
__proto__: Array(0)
__proto__: Object

这就是我的 PUT 方法的样子。

@PutMapping("/employees/{id}")
    public ResponseEntity<Employee> updateEmployee(@PathVariable(value = "id") Long id,
                                                   @RequestBody @NotNull Employee employeeDetails) throws ResourceNotFoundException {
        Employee employee = employeeRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("Employee not found for the id : " + id));

        employee.setName(employeeDetails.getName());
        employee.setDob(employeeDetails.getDob());
        employee.setEmail(employeeDetails.getEmail());

        List<Skill> skillListAll = skillRepository.findAll(); //list of all skills
        List<Skill> skillListEmployee = employee.getSkills();
        List<Skill> temp = new ArrayList<>();

        for(Skill s : skillListEmployee){
            for(Skill skillFromAll: skillListAll){
                if(s.getSkill_name().equals(skillFromAll.getSkill_name())){
                    temp.add(skillFromAll);
                }
            }
        }
        employee.setSkills(temp);
        Employee updatedEmployee = employeeRepository.save(employee);
        return ResponseEntity.ok(updatedEmployee);
    }

请帮我解决这个问题。

这是我的 Employee 实体。

@Entity
@Table(name = "employees")

public class Employee implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @NotNull
    @Column(name = "name")
    private String name;

    @Column(name = "dob")
    private Date dob;

    @NotNull
    @Column(name = "email", unique=true)
    private String email;

    @ManyToMany(fetch = FetchType.LAZY,
            cascade = {
                    CascadeType.PERSIST,
                    CascadeType.MERGE
            })
    @JoinTable(name = "employee_has",
            joinColumns = { @JoinColumn(name = "emp_id") },
            inverseJoinColumns = { @JoinColumn(name = "skill_id") })
    private List<Skill> skills = new ArrayList<>();

    public Employee() {

    }

    public Employee(String name, Date dob, String email) {
        this.name = name;
        this.dob = dob;
        this.email = email;
    }

    public Employee(String name, Date dob, String email, List<Skill> skills) {
        this.name = name;
        this.dob = dob;
        this.email = email;
        this.skills = skills;
    }


    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<Skill> getSkills() {
        return skills;
    }

    public void setSkills(List<Skill> skills) {
            this.skills = skills;
    }

}

【问题讨论】:

  • 你能分享你的Employee@Entity吗?
  • @robert 我现在已将其添加到问题中

标签: angular postgresql spring-boot put


【解决方案1】:

你的forloop坏了

    List<Skill> skillListEmployee = employee.getSkills();
    for(Skill s : skillListEmployee){
        for(Skill skillFromAll: skillListAll){
            if(s.getSkill_name().equals(skillFromAll.getSkill_name())){
                temp.add(skillFromAll);
            }
        }
    }

在这里,您将只保留员工已经具备的那些技能。

你可能想从employeeDetails而不是employee获得技能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多