更新实体,但不为 @onetomany 关系创建新记录 数据库中已存在 table
Updating an entity, but without creating new records for @onetomany relationship is already exists in db table
我几乎整天都在寻找答案,但不知道如何解决这个问题。所以才问,请指教
我有 2 个实体,Patient 和 Dietician - 它们都存储在一个名为 users 的 table 中 - 我有一个名为 User 的父实体,Patient/Dietician 从它继承。
我想做的是,我想知道哪个患者可以更新自己的信息(他必须说,他的年龄,身高,体重,他想要什么类型的饮食,他可以从中选择营养师下拉列表(那些营养师已经存在于数据库 table 中)我现在想做的是用这些信息保存患者,但每次我保存它都是在保存这些信息的同时创建新的营养师条目(复制它)或者说他不能创建那个营养师,因为电子邮件地址字段是唯一的(这就是我想要的)。为什么每次我保存它都是为 ManyToOne 关系创建一个新条目?为什么这不能使用现有的营养师,只是使用现有营养师的 ID 设置 FK (dietician_id)。
这是一堆代码
@Entity
@DiscriminatorValue("1")
public class Patient extends User {
private Double weight;
private Double height;
private Integer age;
@Enumerated(value = EnumType.STRING)
private DietType dietType;
@Enumerated(value = EnumType.STRING)
private Gender gender;
@Enumerated(value = EnumType.STRING)
private PsychicalActivity psychicalActivity;
@OneToMany(mappedBy = "patient", cascade = CascadeType.ALL)
private List<Diet> diets;
@ManyToOne(cascade = CascadeType.ALL)
private Dietician dietician;
@OneToMany(mappedBy = "patient", cascade = CascadeType.ALL)
private List<Visit> visits;
@Entity
@DiscriminatorValue("2")
public class Dietician extends User {
@OneToMany(mappedBy = "dietician", cascade = CascadeType.ALL)
private Set<Patient> patients;
@OneToMany(mappedBy = "dietician", cascade = CascadeType.ALL)
private Set<Visit> visits;
public Dietician() {}
public Dietician(String firstName, String lastName, String emailAddress, String password, Set<Role> roles) {
super(firstName, lastName, emailAddress, password, roles);
}
@PostMapping("/update-data")
public String sendUpdateForm(@ModelAttribute Patient patientForm){
patientService.setUserData(patientForm);
return "patientHomePage";
}
@Override
public Patient setUserData(Patient patientForm) {
Patient patient = patientRepository.findByEmailAddress(patientForm.getEmailAddress());
patient.setGender(patientForm.getGender());
patient.setPsychicalActivity(patientForm.getPsychicalActivity());
patient.setAge(patientForm.getAge());
patient.setDietician(patientForm.getDietician());
return patientRepository.save(patient);
}
设置患者的营养师时,请确保您使用的是从存储库加载的实例,而不是新创建的实例。
所以patient.setDietician(patientForm.getDietician());
应该改成
patient.setDietician(dieticianRepository.findById(patientForm.getDietician().getId());
我几乎整天都在寻找答案,但不知道如何解决这个问题。所以才问,请指教
我有 2 个实体,Patient 和 Dietician - 它们都存储在一个名为 users 的 table 中 - 我有一个名为 User 的父实体,Patient/Dietician 从它继承。
我想做的是,我想知道哪个患者可以更新自己的信息(他必须说,他的年龄,身高,体重,他想要什么类型的饮食,他可以从中选择营养师下拉列表(那些营养师已经存在于数据库 table 中)我现在想做的是用这些信息保存患者,但每次我保存它都是在保存这些信息的同时创建新的营养师条目(复制它)或者说他不能创建那个营养师,因为电子邮件地址字段是唯一的(这就是我想要的)。为什么每次我保存它都是为 ManyToOne 关系创建一个新条目?为什么这不能使用现有的营养师,只是使用现有营养师的 ID 设置 FK (dietician_id)。
这是一堆代码
@Entity
@DiscriminatorValue("1")
public class Patient extends User {
private Double weight;
private Double height;
private Integer age;
@Enumerated(value = EnumType.STRING)
private DietType dietType;
@Enumerated(value = EnumType.STRING)
private Gender gender;
@Enumerated(value = EnumType.STRING)
private PsychicalActivity psychicalActivity;
@OneToMany(mappedBy = "patient", cascade = CascadeType.ALL)
private List<Diet> diets;
@ManyToOne(cascade = CascadeType.ALL)
private Dietician dietician;
@OneToMany(mappedBy = "patient", cascade = CascadeType.ALL)
private List<Visit> visits;
@Entity
@DiscriminatorValue("2")
public class Dietician extends User {
@OneToMany(mappedBy = "dietician", cascade = CascadeType.ALL)
private Set<Patient> patients;
@OneToMany(mappedBy = "dietician", cascade = CascadeType.ALL)
private Set<Visit> visits;
public Dietician() {}
public Dietician(String firstName, String lastName, String emailAddress, String password, Set<Role> roles) {
super(firstName, lastName, emailAddress, password, roles);
}
@PostMapping("/update-data")
public String sendUpdateForm(@ModelAttribute Patient patientForm){
patientService.setUserData(patientForm);
return "patientHomePage";
}
@Override
public Patient setUserData(Patient patientForm) {
Patient patient = patientRepository.findByEmailAddress(patientForm.getEmailAddress());
patient.setGender(patientForm.getGender());
patient.setPsychicalActivity(patientForm.getPsychicalActivity());
patient.setAge(patientForm.getAge());
patient.setDietician(patientForm.getDietician());
return patientRepository.save(patient);
}
设置患者的营养师时,请确保您使用的是从存储库加载的实例,而不是新创建的实例。
所以patient.setDietician(patientForm.getDietician());
应该改成
patient.setDietician(dieticianRepository.findById(patientForm.getDietician().getId());