【问题标题】:Updating an entity, but without creating new records for @onetomany relationship is already exists in db table更新实体,但未为 @onetomany 关系创建新记录,已存在于 db 表中
【发布时间】:2021-03-18 05:59:17
【问题描述】:

我几乎整天都在寻找答案,但不知道如何解决这个问题。所以这就是我问的原因,请指教。

我有 2 个实体,Patient 和 Dietician - 他们都存储在一个名为 users 的表中 - 我有一个名为 User 的父实体,Patient/Dietician 继承自它。

我想要做什么,我有一个关于哪些患者可以更新关于他自己的信息的视图(他必须说他的年龄、身高、体重、他想要什么类型的饮食,他可以从下拉列表中选择营养师列表(那些营养师已经存在于数据库表中)我现在想要做的是我想用这些信息保存患者,但每次我保存它时都会保存这些信息但也会创建新的营养师条目(复制它)或说明他无法创建该营养师,因为电子邮件地址字段是唯一的(这就是我想要的)。为什么每次我保存它时都会为多对一关系创建一个新条目?为什么这不能使用现有的营养师,而只需将 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);
    }

【问题讨论】:

    标签: java jpa spring-data-jpa many-to-many cascade


    【解决方案1】:

    在设置患者的营养师时,请确保您使用的是从存储库加载的实例,而不是新创建的实例。

    所以patient.setDietician(patientForm.getDietician());应该改成类似

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

    【讨论】:

      猜你喜欢
      • 2021-02-20
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多