【问题标题】:collection not populating in many to many relationship集合没有填充多对多关系
【发布时间】:2014-04-01 16:41:47
【问题描述】:

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

类似地,下面的下一个打印屏幕显示了调试器,表明给定 caregiverpatients 集合是空的,在上面指出的控制器执行中,patient 应该已添加到 @ 987654339@:

底层 mysql 数据库中的查询显示caregiver 已添加到caregiver 表中,但连接表中没有记录应将caregiver 与指定的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() 分别返回护理人员和患者集合,如上面链接中文件共享站点的代码所示。

新的护理人员仍未与相应患者的收藏相关联。我如何具体更改这些或其他方法来实现这一点?

【问题讨论】:

  • 我发布了一个答案,但似乎我误解了你的问题。您的问题是控制器未正确填充 caregiver.patients 集合,还是 hibernate 未将集合正确存储到数据库的问题?我的回答属于后者。如果是前者,您将护理人员添加到患者的哪个位置?
  • @KresimirNesek 问题是,当用户创建新的护理人员记录时,护理人员没有被添加到指定患者的护理人员集合中。我更关心患者护理人员。患者的主 jsp 链接到该 jsp,该 jsp 创建一个护理人员,然后返回到患者的主 jsp。

标签: java spring hibernate spring-mvc


【解决方案1】:

从映射来看,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 添加到患者的 caregiver 集中,但不要调用 caregiver.addPatient 以避免递归(或者在 caregiver.addPatient 中删除对 patient.addCaregiver 的调用)。

【讨论】:

  • 感谢您花时间写一个答案。我现在正在测试这个。我会尽快回复。
  • 我对上面的原始帖子进行了编辑,显示了我对 Patient.addCaregiver() 和 Caregiver.addPatient() 所做的更改。新的护理人员仍未添加到所选患者的护理人员集合中。我能做些什么来解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
相关资源
最近更新 更多