Spring Boot Jpa @ManyToOne : DB中的ForeignKey列总是被填充为空。

问题描述 投票:0回答:1

Employee.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;
    }`

技能集.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)中,当我试图通过postman发布数据时,总是被填充为null.其他字段在表中都没有任何问题地被填充。

spring spring-boot spring-data-jpa many-to-many
1个回答
0
投票

之间的关系 SkillsetEmployee 是由 Skillset. 这就意味着JPA会持续不断地保持状态。Skillset 对象有。

但通过 @RequestBody 您正在创建一个 Employee 实例.虽然它引用了一个 Skillset 实例,该实例不引用 Employee. 因此,没有关系被持久化。

要解决这个问题,请添加代码到 setSkillset 来设置 employee 它的属性.类似这样的东西应该做。

public void setSkillset(List<Skillset> skillset) {
    this.skillset = skillset;
    skillset.foreach(s -> s.setEmployee(this));
}
© www.soinside.com 2019 - 2024. All rights reserved.