Код: Выделить всё
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private BigDecimal salary;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id")
private Address address;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "company_id")
private Company company;
}
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String city;
private String street;
private String homeNumber;
}
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "address_id")
private Address Address;
@OneToMany(mappedBy = "company")
private List employees = new ArrayList();
}
Код: Выделить всё
public EmployeeDTO applyPatchToEmployee(EmployeeDTO employeeDTO, JsonMergePatch patch) throws JsonProcessingException, JsonPatchException {
JsonNode employeeNode = mapper.valueToTree(employeeDTO);
JsonNode appliedPatchEmployee = patch.apply(employeeNode);
return mapper.treeToValue(appliedPatchEmployee, EmployeeDTO.class);
}
public void updateEmployee(EmployeeDTO employeeDTO) {
Employee employeeToSave = new Employee(employeeDTO.getId(),employeeDTO.getFirstName(), employeeDTO.getLastName(), employeeDTO.getSalary());
employeeRepository.save(employeeToSave);
}
@PatchMapping("/update/{id}")
public ResponseEntity updateEmployee(@PathVariable Long id, @RequestBody JsonMergePatch patch) throws EmployeeNotFoundException, JsonPatchException, JsonProcessingException {
EmployeeDTO employeeById = employeeService.getEmployeeById(id);
EmployeeDTO employeeByIdPatched = employeeService.applyPatchToEmployee(employeeById, patch);
employeeService.updateEmployee(employeeByIdPatched);
return ResponseEntity.noContent().build();
}
Код: Выделить всё
public void updateEmployee(EmployeeDTO employeeDTO) throws EmployeeNotFoundException {
Employee foundEmployee = findEmployee(employeeDTO.getId());
Employee employeeToSave = new Employee(employeeDTO.getId(),employeeDTO.getFirstName(), employeeDTO.getLastName(), employeeDTO.getSalary());
employeeToSave.setCompany(foundEmployee.getCompany());
employeeToSave.setAddress(foundEmployee.getAddress());
employeeRepository.save(employeeToSave);
}
Я также пытался установить тип каскада для слияния, но это тоже не помогает.
Я понимаю, что DTO не содержит адреса и компании, поэтому без этих установщиков поля будут иметь значение null. Однако я делаю вывод, что... (возможно, я ошибаюсь, потому что я не очень долго изучаю программирование), что мы не хотели бы менять компанию и адрес в DTO, а хотели бы изменить их как-то отдельно, например. в CompanyService и AddressService. Здесь мы заинтересованы в изменении данных сотрудника и сохранении связи с компанией и адресом.
Заранее спасибо!!!
Подробнее здесь: https://stackoverflow.com/questions/785 ... et-to-null
Мобильная версия