spring - 在 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": []
}
解决方案
为什么你没有得到你的@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;
推荐阅读
- java - 在Java中将数据添加到scala WrappedArray
- vim - 是否可以从 vim 帮助提示中修复 'help-curwin' 命令/功能?
- typescript - 使用道具更改 Typescript 中的状态
- sharepoint-online - SPFx 应用定制器中的 CSS 效果延迟
- c# - Xamarin.Android 中未找到属性 Layout_ConstraintTop_to TopOf 问题
- python - 在 python 中使用 multiprocessing.Pool 时无法显示进度(使用 tqdm)
- javascript - 如何从电子托盘图标打开一个新窗口
- c - 净::ERR_INCOMPLETE_CHUNKED_ENCODING 200(好的)
- python-3.x - Django 在管理列表中添加一个带有 ID url 链接的自定义链接
- angular - 如何在 formControl 中设置默认值?