集合没有填充多对多的关系

时间:2014-04-01 16:41:48

标签: java spring hibernate spring-mvc

在spring mvc app中,Caregiver实体与Patient实体之间存在多对多的关系。创建新caregiver的jsp视图未将指定的patient添加到与patients实例关联的caregiver集合中。您可以在控制器代码的以下打印屏幕中看到这一点,该控制器代码正在调试模式下运行,并且已经停在patient应添加到caregiver集合的点下方的行上patients

同样,下面的下一个打印屏幕显示调试器,指示给定patients的{​​{1}}集合为空,在上面指示的控制器执行点,caregiver应该已添加到patient

底层mysql数据库中的查询显示caregiver已添加到caregiver表中,但连接表中没有应将caregivercaregiver链接的记录指定patient。为什么patient未添加到caregiver

如果我在代码的那一部分写patient.addCaregiver(caregiver)caregiver.addPatient(patient),结果是堆栈溢出错误,无休止地重复添加caregiverpatient ,表明手动添加显然是不必要的。那么如何确保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()分别返回护理人员和患者集合,如上面链接中文件共享站点的代码所示。

新护理人员仍与相关患者的收集无关。具体如何更改这些或其他方法来实现这一目标?

1 个答案:

答案 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的调用)。