首页 > 解决方案 > Spring Boot Jpa @ManyToOne:DB 中的 ForeignKey 列始终填充为 null

问题描述

雇员.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"
            }
        ]
    }

我已 在技能集表中附加了 empid 作为外键的 Db Screenshot Database Screenshot

当我尝试通过 postman 发布数据时,技能表中的外键(empid)总是填充为空。其他字段在两个表中都没有任何问题得到填充

标签: springspring-bootspring-data-jpamany-to-many

解决方案


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));
}

推荐阅读