java—db表中已经存在更新实体,但不为@onetomany关系创建新记录

eanckbw9  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(342)

我几乎整天都在寻找答案,却不知道如何解决这个问题。所以这就是为什么我问,请建议。
我得到了两个实体,patient和dietician—它们都存储在一个名为users的表中—我有一个名为user的父实体,patient/dietician从中继承。
我想做的是,我有一个关于哪个病人可以更新关于他自己的信息的视图(他必须说,他是什么年龄,身高,体重,他想要什么类型的饮食,他可以从下拉列表中选择营养师(那些营养师已经存在于数据库表中)我现在想做的是用这些信息保存病人,但每次我保存它是保存这些信息,但也创建新的营养师条目(复制它)或声明,他不能创建营养师,因为emailaddress字段是唯一的(这就是我想要的)。为什么每次我保存它都会为多人关系创建一个新条目?为什么不能使用现有的营养师,只需将fk(营养师id)设置为现有营养师的id即可。
这是一堆代码

  1. @Entity
  2. @DiscriminatorValue("1")
  3. public class Patient extends User {
  4. private Double weight;
  5. private Double height;
  6. private Integer age;
  7. @Enumerated(value = EnumType.STRING)
  8. private DietType dietType;
  9. @Enumerated(value = EnumType.STRING)
  10. private Gender gender;
  11. @Enumerated(value = EnumType.STRING)
  12. private PsychicalActivity psychicalActivity;
  13. @OneToMany(mappedBy = "patient", cascade = CascadeType.ALL)
  14. private List<Diet> diets;
  15. @ManyToOne(cascade = CascadeType.ALL)
  16. private Dietician dietician;
  17. @OneToMany(mappedBy = "patient", cascade = CascadeType.ALL)
  18. private List<Visit> visits;
  1. @Entity
  2. @DiscriminatorValue("2")
  3. public class Dietician extends User {
  4. @OneToMany(mappedBy = "dietician", cascade = CascadeType.ALL)
  5. private Set<Patient> patients;
  6. @OneToMany(mappedBy = "dietician", cascade = CascadeType.ALL)
  7. private Set<Visit> visits;
  8. public Dietician() {}
  9. public Dietician(String firstName, String lastName, String emailAddress, String password, Set<Role> roles) {
  10. super(firstName, lastName, emailAddress, password, roles);
  11. }
  1. @PostMapping("/update-data")
  2. public String sendUpdateForm(@ModelAttribute Patient patientForm){
  3. patientService.setUserData(patientForm);
  4. return "patientHomePage";
  5. }
  1. @Override
  2. public Patient setUserData(Patient patientForm) {
  3. Patient patient = patientRepository.findByEmailAddress(patientForm.getEmailAddress());
  4. patient.setGender(patientForm.getGender());
  5. patient.setPsychicalActivity(patientForm.getPsychicalActivity());
  6. patient.setAge(patientForm.getAge());
  7. patient.setDietician(patientForm.getDietician());
  8. return patientRepository.save(patient);
  9. }
13z8s7eq

13z8s7eq1#

设置患者的营养师时,请确保使用的是从存储库加载的示例,而不是新创建的示例。
所以呢 patient.setDietician(patientForm.getDietician()); 应该改成

  1. patient.setDietician(dieticianRepository.findById(patientForm.getDietician().getId());

相关问题