更新实体,但不为 @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());