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



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为外键的数据库截图

当我试图通过postman发布数据时,skillset表中的外键(empid(总是填充为null。在两个表中,其他字段都被填充而没有任何问题

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

最新更新