在spring mvc app中,Caregiver
实体与Patient
实体之间存在多对多的关系。创建新caregiver
的jsp视图未将指定的patient
添加到与patients
实例关联的caregiver
集合中。您可以在控制器代码的以下打印屏幕中看到这一点,该控制器代码正在调试模式下运行,并且已经停在patient
应添加到caregiver
集合的点下方的行上patients
:
同样,下面的下一个打印屏幕显示调试器,指示给定patients
的{{1}}集合为空,在上面指示的控制器执行点,caregiver
应该已添加到patient
:
底层mysql数据库中的查询显示caregiver
已添加到caregiver
表中,但连接表中没有应将caregiver
与caregiver
链接的记录指定patient
。为什么patient
未添加到caregiver
?
如果我在代码的那一部分写patient.addCaregiver(caregiver)
或caregiver.addPatient(patient)
,结果是堆栈溢出错误,无休止地重复添加caregiver
和patient
,表明手动添加显然是不必要的。那么如何确保patient
被添加?
作为参考,我已将Caregiver
实体和Patient
实体的完整代码添加到文件共享站点,您可以通过单击以下链接访问该站点:
Click here查看Caregiver
实体的代码
您可以查看Patient
实体by clicking on this link的代码。
编辑:
根据Kresimir的建议,我改变了Patient.addCaregiver()方法如下:
public void addCaregiver(Caregiver c) {getCaregiversInternal().add(c);}
我还将Caregiver.addPatient()方法修改为:
public void addPatient(Patient p) {getPatientsInternal().add(p);}
请注意,getCaregiversInternal()和getPatientsInternal()分别返回护理人员和患者集合,如上面链接中文件共享站点的代码所示。
新护理人员仍与相关患者的收集无关。具体如何更改这些或其他方法来实现这一目标?
答案 0 :(得分:0)
从映射来看,Patient
是拥有Patient
- Caregiver
关系的实体。这可以从inverseJoinColumn
指向caregiver_id
的事实推断出来。
@ManyToMany(cascade = {CascadeType.ALL}, fetch=FetchType.EAGER)
@JoinTable(name="careTeamJunction",
joinColumns={@JoinColumn(name="patient_id")},
inverseJoinColumns={@JoinColumn(name="caregiver_id")}) //patient owns relationship
private Set<Caregiver> caregivers = new HashSet<Caregiver>();
由于Patient
是拥有该关系的实体,因此将Caregiver
添加到Patient
对象的caregivers
集应该足够了,而hibernate应该存储联接表中的关系。
此外,addPatient和addCaregiver方法存在问题 - 它们互相调用创建无限递归。修改patient.addCaregiver以将护理人员添加到患者的护理人员集中,但也不要调用caregiver.addPatient以避免递归(或者在caregiver.addPatient中删除对patient.addCaregiver的调用)。