【问题标题】:Updating table is not happening through Setters in Spring JPA在 Spring JPA 中没有通过 Setter 更新表
【发布时间】:2020-03-19 06:50:54
【问题描述】:

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

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

Worker.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";
     }

     }

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

[
{
    "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": []
}

【问题讨论】:

    标签: spring spring-boot jpa spring-data-jpa


    【解决方案1】:

    你说:

    "...在获取特定员工时,我想要员工列表 与他相关联的也将被取走”

    那么你必须在员工方面写一个 OneToMany 关系。您所做的是尝试为每个 Worker 获取一个 Employee ,该 Employee 当然正在工作并且存在于您的 JSON 结果中。

    这里是 Emplyees 类方面的 OneToMany 示例:

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

    注意:mappedBy 必须在您的 Worker Class 中引用变量 Emplyee employee

    请尝试不同的获取类型。

    【讨论】:

    • 我实现了你的回答。但现在它在 worker ->employee 中再次打印员工详细信息 n 类型,例如员工 ->worker 列表。如何限制它以及为什么会发生。因为同时映射一对多和多对一??/
    • 我知道这个问题。我认为这不是 n 次,您在同一个对象上查看 n 次,每次都具有相同的变量。默认情况下,Spring 中的每个 bean 都是一个 Singelton(一个静态对象)。但我真的不知道。可能您必须做出决定是一对多还是多对一关系。
    • 为什么会这样??不能这样映射吗?实现它的最佳方法是什么??
    • 你将如何做到这一点?当您要求具有多对一关系的工人时,您会得到具有该关系的工人。这就是您想要的,因为您为它编写代码。如果您不希望这样做,请尝试创建两个 Worker 实体(一个具有多对一关系,一个不具有该关系),并随时向您的员工询问没有该多对一关系的 Worker 实体。作为替代,仅实现对您的业务逻辑更重要的这些关系。希望有帮助
    【解决方案2】:

    为什么你没有得到你的@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;
    

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多