首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @ManyToOne : DB中的ForeignKey列始终填充为null

Spring @ManyToOne : DB中的ForeignKey列始终填充为null
EN

Stack Overflow用户
提问于 2020-05-07 21:04:35
回答 1查看 2.3K关注 0票数 0

Employee.Java

`

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

`

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

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

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

控制器

代码语言:javascript
复制
@PostMapping(value = "/signup",produces = {"application/json"})
    public Employee addEmployee(@RequestBody Employee employee) {
        empRepo.save(employee);
        return employee;
    }

Json数据

代码语言:javascript
复制
{
        "empname": "sandep",
        "empcontact": "9650114890",
        "empemail": "aidaih",
        "empphoto": "paidpaid",
        "skillset": [
            {
                "skillname": "jop"
            }
        ]
    }

我附上了Db截图技能表中以空号作为外键的数据库屏幕截图

当我尝试通过postman.other字段发布数据时,技能集表中的外键(Empid)总是填充为null,在这两个表中都没有任何问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-08 08:02:51

SkillsetEmployee之间的关系属于Skillset。这意味着JPA将持久化Skillset对象的状态。

但是通过@RequestBody,您将创建一个Employee实例。当引用Skillset实例时,该实例不引用Employee。因此,没有任何关系会持续下去。

若要修复此问题,请将代码添加到setSkillset以设置其employee属性。像这样的事情应该可以做到:

代码语言:javascript
复制
public void setSkillset(List<Skillset> skillset) {
    this.skillset = skillset;
    skillset.foreach(s -> s.setEmployee(this));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61667727

复制
相关文章

相似问题

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