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

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

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

13z8s7eq1#

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

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

相关问题