Spring JPA中的setter没有更新表
我对Spring boot和Spring数据JPA是新手。因此,这里我尝试实现一个示例项目,其中一个员工有一个员工列表,同时添加一个新员工也有员工详细信息,以表明他为特定员工工作。我可以更新worker表,也可以完美地获取详细信息。我也在尝试更新Employee表,以便在获取某个特定员工时,我希望也获取与他相关联的员工列表。但这并没有发生,到目前为止,我还没有使用过任何查询,因为它看起来是简单的更新,我认为只要保存和设置程序就可以了 Employee.JavaSpring JPA中的setter没有更新表,spring,spring-boot,jpa,spring-data-jpa,Spring,Spring Boot,Jpa,Spring Data Jpa,我对Spring boot和Spring数据JPA是新手。因此,这里我尝试实现一个示例项目,其中一个员工有一个员工列表,同时添加一个新员工也有员工详细信息,以表明他为特定员工工作。我可以更新worker表,也可以完美地获取详细信息。我也在尝试更新Employee表,以便在获取某个特定员工时,我希望也获取与他相关联的员工列表。但这并没有发生,到目前为止,我还没有使用过任何查询,因为它看起来是简单的更新,我认为只要保存和设置程序就可以了 Employee.Java @Entity public cl
@Entity
public class Employee {
@Id
private int empId;
private String empName;
private String location;
@OneToMany
private List<Worker> workers;
public Employee(){
}
public Employee(int empId, String empName, String location) {
super();
this.empId = empId;
this.empName = empName;
this.location = location;
}
public List<Worker> getWorkers() {
return workers;
}
public void setWorkers(List<Worker> workers) {
this.workers = workers;
}
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 getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public void setWorkers(Worker worker) {
this.workers.add(worker);
}
@Override
public String toString() {
return "Employee [empId=" + empId + ", empName=" + empName + ", location=" + location + ", workers=" + workers
+ "]";
}
/*@Override
public String toString() {
return "Employee [empId=" + empId + ", empName=" + empName + ", location=" + location + "]";
}*/
@Entity
public class Worker {
@Id
private int id;
private String name;
@ManyToOne
@JoinColumn(name="empId")
private Employee employee;
public Worker(int id, String name , int empId) {
super();
this.id = id;
this.name = name;
this.employee = new Employee(empId,"","");
}
public Worker() {
// TODO Auto-generated constructor stub
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@RestController
public class WorkerController {
@Autowired
WorkerRepository workerService;
@Autowired
EmployeeRepository employeeService;
@GetMapping("/employees/{id}/workers")
public List<Worker> getAllWorker(@PathVariable("id") int empId){
return workerService.findByEmployeeEmpId(empId);
}
@PostMapping("/employees/{id}/workers")
public String addNewEmployee(@RequestParam("name") String name ,
@RequestParam("workerId") int id , @PathVariable("id") int empId){
Worker worker = new Worker();
List<Worker> workers = new ArrayList<Worker>();
worker.setId(id);
worker.setName(name);
worker.setEmployee(new Employee(empId,"",""));
workerService.save(worker);
workers.add(worker);
employeeService.findById(empId).get().setWorkers(workers);
Employee emp = new Employee();
emp = employeeService.findById(empId).get();
return "Successfully added";
}
}
WorkerController.Java
@Entity
public class Employee {
@Id
private int empId;
private String empName;
private String location;
@OneToMany
private List<Worker> workers;
public Employee(){
}
public Employee(int empId, String empName, String location) {
super();
this.empId = empId;
this.empName = empName;
this.location = location;
}
public List<Worker> getWorkers() {
return workers;
}
public void setWorkers(List<Worker> workers) {
this.workers = workers;
}
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 getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public void setWorkers(Worker worker) {
this.workers.add(worker);
}
@Override
public String toString() {
return "Employee [empId=" + empId + ", empName=" + empName + ", location=" + location + ", workers=" + workers
+ "]";
}
/*@Override
public String toString() {
return "Employee [empId=" + empId + ", empName=" + empName + ", location=" + location + "]";
}*/
@Entity
public class Worker {
@Id
private int id;
private String name;
@ManyToOne
@JoinColumn(name="empId")
private Employee employee;
public Worker(int id, String name , int empId) {
super();
this.id = id;
this.name = name;
this.employee = new Employee(empId,"","");
}
public Worker() {
// TODO Auto-generated constructor stub
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@RestController
public class WorkerController {
@Autowired
WorkerRepository workerService;
@Autowired
EmployeeRepository employeeService;
@GetMapping("/employees/{id}/workers")
public List<Worker> getAllWorker(@PathVariable("id") int empId){
return workerService.findByEmployeeEmpId(empId);
}
@PostMapping("/employees/{id}/workers")
public String addNewEmployee(@RequestParam("name") String name ,
@RequestParam("workerId") int id , @PathVariable("id") int empId){
Worker worker = new Worker();
List<Worker> workers = new ArrayList<Worker>();
worker.setId(id);
worker.setName(name);
worker.setEmployee(new Employee(empId,"",""));
workerService.save(worker);
workers.add(worker);
employeeService.findById(empId).get().setWorkers(workers);
Employee emp = new Employee();
emp = employeeService.findById(empId).get();
return "Successfully added";
}
}
但是在检索时,我可以看到employee表没有更新。有人能指引我吗
{
"empId": 99,
"empName": "darsha",
"location": "mumbai",
"workers": []
}
你说:
“…在获取特定员工时,我需要员工列表
与他有联系的人也会被带走”
然后,你必须在员工方面写下“一对一”的关系。您要做的是尝试为每个工人提取一名员工,这当然是在工作,并且存在于JSON结果中
以下是员工阶级方面的一个OneToMany示例:
@OneToMany(mappedBy="employee", fetch=FetchType.EAGER, cascade=CascadeType.ALL)
private List<Worker> worker = new ArrayList<>();
@OneToMany(mappedBy=“employee”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
private List worker=new ArrayList();
注意:mappedBy必须引用Worker类中的变量employee employee
请尝试不同的获取类型。为什么您没有获取
@OneToMany
属性是因为默认情况下,对于所有@OneToMany
关联,如list、set,获取类型都是惰性的
为了克服这个问题。将默认的延迟获取更改为即时获取
将您的实体映射修改为此
@OneToMany(mappedBy="employee", fetch=FetchType.EAGER, cascade=CascadeType.ALL) private List<Worker> worker = new ArrayList<>();
我实现了你的回答。但现在,它正在打印员工详细信息n种类型,如“员工->员工列表”中的“员工->员工”。如何限制这种情况以及为什么会发生。因为一对多和多对一同时映射???/我知道这个问题。我认为这不是n次,你在同一个物体上看n次,每次都有相同的变量。默认情况下,Spring中的每个bean都是Singleton(一个静态对象)。但我真的不知道。也许你必须做出决定,要么是一对多,要么是多对一。为什么呢??难道不可能这样绘制地图吗?实施它的最佳方式是什么?您将如何做到这一点?当你要求一个有多对一关系的员工时,你会得到那个有多对一关系的员工。这就是你想要的,因为你要为它编写代码。如果你不想这样,试着创建两个工人实体(一个有多对一关系,一个没有多对一关系),并随时向你的员工询问没有多对一关系的工人实体。作为替代方案,仅实现这些关系,这对您的业务逻辑更为重要。希望能有帮助