Обновление сущности - внешние ключи имеют значение nullJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Обновление сущности - внешние ключи имеют значение null

Сообщение Anonymous »

Итак, у меня есть 3 объекта:

Код: Выделить всё

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();
}

Когда я пытаюсь выполнить обновление с помощью приведенных ниже методов, внешние ключи в таблице сотрудников (company_id, Address_id) устанавливаются в значение null.

Код: Выделить всё

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();
}
Проблема решена, когда я заменю метод updateEmployee в службе следующим:

Код: Выделить всё

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);
}
Мой вопрос: есть ли возможность сделать это по-другому. Наконец, у нас может быть случай, когда таких полей будет, например, 10, и это будет не очень хороший метод.
Я также пытался установить тип каскада для слияния, но это тоже не помогает.
Я понимаю, что DTO не содержит адреса и компании, поэтому без этих установщиков поля будут иметь значение null. Однако я делаю вывод, что... (возможно, я ошибаюсь, потому что я не очень долго изучаю программирование), что мы не хотели бы менять компанию и адрес в DTO, а хотели бы изменить их как-то отдельно, например. в CompanyService и AddressService. Здесь мы заинтересованы в изменении данных сотрудника и сохранении связи с компанией и адресом.
Заранее спасибо!!!

Подробнее здесь: https://stackoverflow.com/questions/785 ... et-to-null
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»