Обработка вставки дочерней сущности в API REST с помощью JPA - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть родительский / дочерний объект, который определяется следующим образом:

В Сотрудник класс:

    @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL )
    @JsonManagedReference
    private List<Phone> phones = new ArrayList<>();

В Телефон класс :

    @ManyToOne
    @JsonBackReference
    private Employee employee;

И когда я хочу вставить или получить новый телефон в ресурсе /employees/{employeeId}/phones/{id} внутри PhoneService

    @Override // POST
    public Phone createPhone(long employeeId, @Valid Phone phone) {
        Employee employee = employeeRepository.findById(employeeId).orElseThrow(() -> 
            new EntityNotFoundException("Could not find an employee for the provided ID.")    
        );

//      ## option 1
        employee.addPhone(phone);
        phone.setEmployee(employee);

        employeeRepository.save(employee);

        return phoneRepository.findById(phone.getId()).orElseThrow(() ->
            new EntityNotFoundException("Could not find a phone for the provided ID.")
        );

//      ## option 2
//      phone.setEmployee(employee);
//      return phoneRepository.save(phone);
    }

    @Override // GET
    public Phone getPhone(long employeeId, long id) {
        return phoneRepository.findById(id).orElseThrow(() ->
            new EntityNotFoundException("Could not find a phone for the provided ID.")
        );
    }

Я чувствую, что вариант 2 проще, но я технически делаю это неправильно, потому что я прямо ищу телефон в БД, не заботясь об идентификаторе его сотрудника.

1 Ответ

0 голосов
/ 30 апреля 2020

Я думаю, что Вариант 2 правильный. Единственное, что вы пропустили, это добавление уникального ключа (PhoneNumber + I c), поскольку логически один (phoneNumber + i c) должен быть связан только с одним сотрудником.

О Option1, API которого называется "createPhone", но на самом деле он работает с таблицей сотрудников, что, на мой взгляд, вводит в заблуждение и неправильно.

Более подходящий код должен выглядеть так:

public Phone createPhone(Long employeeId, Phone phone) {
   phone.setEmployeeId(employeeId);
   return phoneRepository.save(phone);
}

//Ohter API about update an employee with the whole phone list
public Phone updateEmployee(Long employeeId, List<Phone> phones) {
    Employee employee = employeeRepository.findById(employeeId).orElseThrow(() -> 
            new EntityNotFoundException("Could not find an employee for the provided ID.")    
        );
    employee.setPhone(phones);
    employeeRepository.save(employee);
}
...