Эффективное обновление сущности в Hibernate
Я думаю, это может быть как вопрос новичка, но все же я хотел бы знать некоторые ответы.
Допустим, есть сущности: Больница и Доктор (Многие-ко-многим). Предположим, что в моем классе диспетчера я должен забрать всех существующих врачей и больниц, а затем нанять одного врача в конкретной больнице
@Controller
public class HospitalController {
...
@RequestMapping("/hireDoctor")
public String (HttpServletRequest request, Model model) {
List<Hospital> hospitals = hospitalService.findAllHospitals();
List<Doctor> doctors = doctorService.findAllDoctors();
//some logic, in the end we choose just one doctor and one hospital
Doctor doctor = doctors.get(0);
Hospital hospital = hospitals.get(0);
hospitalService.hireDoctor(hospital, doctor);
}
...
@Service
public class HospitalService {
..
@Transactional
public void hireDoctor(Hospital hospital, Doctor doctor) {
//ideally
List<Doctor> doctors = hospital.getDoctors();
doctors.add(doctor);
this.em.merge(hospital);
}
..
}
Это, конечно, не работает, потому что - как я понимаю - я собрал всех врачей и больниц в моем контроллере, а затем в методе hireDoctor мы открываем транзакции, передавая обычные объекты Java, которых нет в сеансе.
Я знаю, что я могу просто снова вызвать Больницу с конкретным идентификатором и Доктора с конкретным идентификатором, а затем сохранить его
public void hireDoctor(Hospital hospital, Doctor doctor) {
Hospital h = hospitalRepo.getHospitalById(hospital.getId());
Doctor d = hospitalRepo.getDoctorById(doctor.getId());
List<Doctor> doctors = h.getDoctors();
doctors.add(d);
}
Но это выглядит просто мусором.
Итак, как такое обновление должно выглядеть наиболее эффективным?