how to save entities in a relation to database in spring boot

Viewed 544

I have a spring boot application with two entities in a relationship. MeetingSetting and MeetingTime meetingSetting can have unlimited meetingTimes. So far the databases are generating without problem, but When I try to save my Entity they are saved but different from each other, they are saved independently. Meaning MeetingName which is a foreign key inside MeetingTime is not saved but seen as null (I debugged and tried finding out why but could not find anything) THe other values are saved-

could someone point me out what my error is?

this is the json I am sending:

{
   "meetingName":"TEst",
   "meetingPw":"",
   "meetingTime":[
      {
         "date":"2021-05-31",
         "startTime":"15:30",
         "endTime":"16:30"
      },
      {
         "date":"2021-06-21",
         "startTime":"15:30",
         "endTime":"17:30"
      },
      {
         "date":"2021-06-21",
         "startTime":"11:01",
         "endTime":"11:01"
      }
   ]
}

MeetingSettings:

@Entity
@Table(name = "meeting_settings")
@Data

public class MeetingsSetting {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "meeting_name", unique = true)
    private String meetingName;

    @Column(name = "meeting_url")
    private String meetingUrl;

    @Column(name = "meeting_pw")
    private String meetingPw;

    @OneToMany(mappedBy = "meeting_Name", cascade = CascadeType.ALL)
    private Set<MeetingTime> meetingTime = new HashSet<>();
}

MeetingTime:

@Entity
@Table(name = "meeting_times")
@Data
public class MeetingTime {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "meeting_date")
    private String date;

    @Column(name = "start_time")
    private String startTime;

    @Column(name = "end_time")
    private String endTime;

    @ManyToOne
    @JoinColumn(name = "meeting_name" ,insertable = false, updatable = false , referencedColumnName = "meeting_name")
    private MeetingsSetting meeting_Name;
}

this is how I try to save the entity:

@RestController
@RequestMapping("/api/meetingSetting")
public class MeetingSettingController {

    @Autowired
    MeetingSettingService meetingSettingService;

    @PostMapping("/")
    public void saveMeeting(@RequestBody MeetingsSetting meetingsSetting){
        meetingSettingService.saveMeeting(meetingsSetting);

    }


}

My service calls the save method of an jpaRepository.

2 Answers

In a bi-directional One to Many, you have to synchronize both sides of the association.

You can simply iterate over all MeetingTime objects and set the corresponding MeetingSetting to it.

Your MeetingSettingService's saveMeeting method could do this:

public void saveMeeting(MeetingsSetting meetingsSetting) {
    // ... 
    
    // here you're synchronizing both sides of the association
    meetingsSetting.getMeetingTime()
            .forEach(mt -> mt.setMeetingSetting(meetingSetting));
    // ...
    repository.save(meetingSetting);
}

Solution to my question, I am not sure if this is a good or correct way of solving this maybe someone can advice me a better solution:

 @Entity
    @Table(name = "meeting_times")
    @Data
    public class MeetingTime implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(name = "meeting_date")
        private String date;
    
        @Column(name = "start_time")
        private String startTime;
    
        @Column(name = "meeting_name")
        private String meeting_name;
        THIS IS THE PART WHICH IS CALLED FROM THE METHOD INSIDE MEETINGSCONTROLLER
        @Column(name = "end_time")
        private String endTime;
    
        @ManyToOne
        @JoinColumn(name = "meeting_name" ,insertable = false, updatable = false, referencedColumnName = "meeting_name")
        private MeetingsSetting meetingName;
    }

MeetingsTime Entity:

@RestController
        @RequestMapping("/api/meetingSetting")
        public class MeetingSettingController {
        
            @Autowired
            MeetingSettingService meetingSettingService;
        
            @PostMapping("/")
            public void saveMeeting(@RequestBody MeetingsSetting meetingsSetting){
                meetingsSetting.getMeetingTime()
                        .forEach(mt -> mt.setMeeting_name(meetingsSetting.getMeetingName()));
                // ...
                meetingSettingService.saveMeeting(meetingsSetting);
        
            }
        
        
        }
Related