Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JPA中的setter没有更新表_Spring_Spring Boot_Jpa_Spring Data Jpa - Fatal编程技术网

Spring JPA中的setter没有更新表

Spring 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

我对Spring boot和Spring数据JPA是新手。因此,这里我尝试实现一个示例项目,其中一个员工有一个员工列表,同时添加一个新员工也有员工详细信息,以表明他为特定员工工作。我可以更新worker表,也可以完美地获取详细信息。我也在尝试更新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 + "]";
}*/
@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(一个静态对象)。但我真的不知道。也许你必须做出决定,要么是一对多,要么是多对一。为什么呢??难道不可能这样绘制地图吗?实施它的最佳方式是什么?您将如何做到这一点?当你要求一个有多对一关系的员工时,你会得到那个有多对一关系的员工。这就是你想要的,因为你要为它编写代码。如果你不想这样,试着创建两个工人实体(一个有多对一关系,一个没有多对一关系),并随时向你的员工询问没有多对一关系的工人实体。作为替代方案,仅实现这些关系,这对您的业务逻辑更为重要。希望能有帮助