首页 > 解决方案 > 在 Spring JPA 中没有通过 Setter 更新表

问题描述

我是 Spring boot 和 Spring Data JPA 的新手。所以在这里我试图实现一个示例项目,其中员工有工人列表,同时添加一个新工人有员工详细信息也表明他为特定员工工作。我能够更新工作表并完美地获取详细信息。我也在尝试更新 Employee 表,以便在获取特定员工的同时,我也希望获取与他关联的员工列表。但这并没有发生,我没有使用任何查询,因为它看起来很简单,我认为只是保存和设置器会帮助这样做。

雇员.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 + "]";
}*/

工人.Java

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

WorkerController.Java

@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";
     }

     }

添加工人后,我检索以下内容作为输出

[
{
    "id": 108,
    "name": "vijay",
    "employee": {
        "empId": 99,
        "empName": "darsha",
        "location": "mumbai",
        "workers": []
    }
},
{
    "id": 110,
    "name": "suraj",
    "employee": {
        "empId": 99,
        "empName": "darsha",
        "location": "mumbai",
        "workers": []
    }
}
]

但是在检索时我可以看到员工表没有更新。有人可以指导我。

{
"empId": 99,
"empName": "darsha",
"location": "mumbai",
"workers": []
}

标签: springspring-bootjpaspring-data-jpa

解决方案


为什么你没有得到你的@OneToMany属性是由于获取类型默认情况下对于所有@OneToMany关联(如列表、集合)都是惰性的。

为了克服这个问题。将默认的延迟获取更改为急切获取。

将您的实体映射修改为此。

@OneToMany(mappedBy="employee", fetch=FetchType.EAGER, cascade=CascadeType.ALL) private List<Worker> worker = new ArrayList<>();

在获取时,您可能会得到递归映射。为避免这种情况,只需@JsonIgnoreProperties 在工人类中添加您的员工字段。

例子:

@JsonIgnoreProperties("employee")
@ManyToOne
@JoinColumn(name="empId") 
private Employee employee;

推荐阅读