spring - 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)总是填充为空。其他字段在两个表中都没有任何问题得到填充
解决方案
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));
}
推荐阅读
- mysql - 错误 1698 (28000): 拒绝用户 'superuser1'@'localhost' 的访问
- r - R Sub函数替换有空格的模式
- wordpress - WordPress 单一 IP 允许 wp-admin 访问
- java - 在 Java 中向 Concordance 函数添加频率计数
- node.js - 有没有一种优雅的方式来呈现两组猫鼬文档?
- javascript - 有没有办法在javascript中做类似 if (Variable == 1 or Variable == 2 or Variable == 3) 的事情?
- python - 基于移位值/递归算法的系列计算
- bash - 如果“>”在命令之后,为什么 bash 重定向会在命令启动之前*发生?
- google-cloud-platform - GCP 实例:Ipython Notebook 下载到本地系统
- html - 在带有 Angular 条件类的 HTML 表格上设置边框在 Safari 上不起作用