【发布时间】:2015-11-07 02:57:56
【问题描述】:
我想这可能是一个新手问题,但我仍然想知道一些答案。
假设有实体:医院和医生(多对多)。假设在我的控制器类中,我必须获取所有现有的医生和医院,然后在特定医院雇用一名医生
@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);
}
..
}
这当然行不通,因为 - 据我了解 - 我已经在我的控制器中获取了所有医生和医院,然后在hiredDoctor 方法中我们打开了传递常规 Java 对象的事务,这些对象不在会话中。
我知道,我可以再次获取具有特定 ID 的 Hospital,以及具有特定 ID 的 Doctor,然后保存
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);
}
但它看起来很垃圾。
那么 - 这样的更新应该如何最有效?
【问题讨论】:
-
一个明显的解决方法是使用 SQLQuery 并向医生医院表中插入一行。但我仍然对类似 Hibernate 的解决方案感到好奇 - 猜测二级缓存可能会有所帮助。
标签: java hibernate spring-mvc