Spring Boot Jpa @ManyToOne: столбец ForeignKey в БД всегда заполняется до нуля - PullRequest
0 голосов
/ 08 мая 2020

Сотрудник. Java

`

import lombok.ToString;
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.List;
    @ToString
    @Entity
    public class Employee {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int empid;
        private String empname;
        private String empcontact;
        private String empemail;
        private String empphoto;
        @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL)
        private List<Skillset> skillset;

 public int getEmpid() {
        return empid;
    }

    public void setEmpid(int empid) {
        this.empid = empid;
    }

    public String getEmpname() {
        return empname;
    }

    public void setEmpname(String empname) {
        this.empname = empname;
    }

    public String getEmpcontact() {
        return empcontact;
    }

    public void setEmpcontact(String empcontact) {
        this.empcontact = empcontact;
    }

    public String getEmpemail() {
        return empemail;
    }

    public void setEmpemail(String empemail) {
        this.empemail = empemail;
    }

    public String getEmpphoto() {
        return empphoto;
    }

    public void setEmpphoto(String empphoto) {
        this.empphoto = empphoto;
    }

    public List<Skillset> getSkillset() {
        return skillset;
    }

    public void setSkillset(List<Skillset> skillset) {
        this.skillset = skillset;
    }`

SkillSet. Java

`

package aurozen.assign.aurozenassign.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.ToString;

import javax.persistence.*;

@Entity
public class Skillset {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int skillid;

    private String skillname;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "empId", nullable = false,updatable = false, insertable = true)
    private Employee employee;

    public int getSkillid() {
        return skillid;
    }

    public void setSkillid(int skillid) {
        this.skillid = skillid;
    }

    public String getSkillname() {
        return skillname;
    }

    public void setSkillname(String skillname) {
        this.skillname = skillname;
    }

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    @Override
    public String toString() {
        return "Skillset{" +
                "skillid='" + skillid + '\'' +
                ", skillname='" + skillname + '\'' +
                ", employee=" + employee +
                '}';
    }
}

`

EmployeeRepositry. java

package aurozen.assign.aurozenassign.repositry;


import aurozen.assign.aurozenassign.entity.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface EmployeeRepositry extends JpaRepository<Employee, Integer> {

    Optional<Employee> findByEmpcontact(String s);
}

SkillSetRepositry. java

package aurozen.assign.aurozenassign.repositry;


import aurozen.assign.aurozenassign.entity.Skillset;
import org.springframework.data.jpa.repository.JpaRepository;

public interface SkillsetRepositry extends JpaRepository<Skillset, Integer> {
}

Контроллер

@PostMapping(value = "/signup",produces = {"application/json"})
    public Employee addEmployee(@RequestBody Employee employee) {
        empRepo.save(employee);
        return employee;
    }

Json Данные

{
        "empname": "sandep",
        "empcontact": "9650114890",
        "empemail": "aidaih",
        "empphoto": "paidpaid",
        "skillset": [
            {
                "skillname": "jop"
            }
        ]
    }

Я прикрепил снимок экрана Db Снимок экрана базы данных с empid в качестве внешнего ключа в таблице набора навыков

внешний ключ (empid) в таблице набора навыков всегда заполняется до нуля, когда я пытаюсь отправить данные через почтальона. Другие поля заполняются без каких-либо проблем в обеих таблицах

1 Ответ

0 голосов
/ 08 мая 2020

Связь между Skillset и Employee принадлежит Skillset. Это означает, что JPA сохранит состояние, в котором находятся объекты Skillset.

Но через @RequestBody вы создаете экземпляр Employee. Хотя это ссылается на экземпляры Skillset, этот экземпляр не ссылается на Employee. Поэтому связь не сохраняется.

Чтобы исправить это, добавьте код в setSkillset, чтобы установить его свойство employee. Примерно так должно получиться:

public void setSkillset(List<Skillset> skillset) {
    this.skillset = skillset;
    skillset.foreach(s -> s.setEmployee(this));
}
...