Как сохранить несколько сущностей с отношениями

#java #spring #spring-boot

Вопрос:

В моем приложении spring boot у меня есть 3 объекта: Набор встреч, дата встречи и время. На идентификатор MeetingSettingsId ссылаются как дата, так и время. время также имеет идентификатор даты в качестве ссылки. Я знаю, что хочу отправить такой json на свой сервер:

 {
   "meetingName":"hallo",
   "meetingUrl":"",
   "meetingPw":"s",
   "dates":"2021-05-30",
   "times":[
      {
         "startTime":"15:30",
         "endTime":"16:30"
      },
      {
         "startTime":"18:30",
         "endTime":"19:30"
      }
   ]
}
 

Но я получаю следующую ошибку:

    not-null property references a null or transient value : com.cbc.coorporateblinddateservice.entities.times.Time.meetingDate
 

Я хочу сохранить с помощью одного метода встречи с показанным json.

Вот как выглядят мои сущности:

    @Entity
    @Table(name = "meeting_date")
    @Data
    public class Date {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(name = "meeting_date")
        private String date;
    
        @OneToMany(mappedBy = "meetingDate", cascade = CascadeType.ALL)
        private List<Time> meetingTime = new ArrayList<>();
    
        @ManyToOne()
        @JoinColumn(name = "meeting_settings_name", nullable = false)
        private MeetingsSetting meetingsSetting;
    
@JsonCreator
public static Date fromDateAsString(String dateString){
    Date date = new Date();
    date.setDate(dateString);
    return date;
}    


}
 

Встречи на высшем уровне:

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

public class MeetingsSetting {

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

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

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

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

    @OneToMany(mappedBy = "meetingsSetting", cascade = CascadeType.ALL)
    private Date dates = new Date();

    @OneToMany(mappedBy = "meetingsSetting", cascade = CascadeType.ALL)
    private List<Time> times = new ArrayList<>();


}
 

и, наконец, время:

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

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

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

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

    @ManyToOne()
    @JoinColumn(name = "meeting_settings_name", nullable = false)
    private MeetingsSetting meetingsSetting;

    @ManyToOne()
    @JoinColumn(name = "meeting_date_id")
    private Date meetingDate;

}
 

это метод сохранения, который я использую, и здесь, вероятно, возникает ошибка. Я думаю, что мне тоже нужно сказать, чтобы сэкономить время и дату, если я не ошибаюсь, но я не знал, как это сделать, метод службы вызывает сохранение из jparepository:

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

    }
 

Комментарии:

1. Я сам заметил несколько ошибок и соответствующим образом обновил вопрос

Ответ №1:

Проблема с вашей реализацией заключается в том, что вы предоставляете поле даты в виде строки, но в базовой модели оно представлено как объект типа Дата.

Вы должны убедиться, что ваша внутренняя модель представляет ваш json, например, введя DTOs ( объект передачи данных), соответствующий вашей модели json, а затем сопоставьте ее с вашими сущностями. Однако, если вы просто разрабатываете это приложение для тестов или в качестве доказательства концепции. Вот рабочее решение, просто добавьте этот метод в свой Date.java класс :

 @JsonCreator
public static Date fromDateAsString(String dateString){
    Date date = new Date();
    date.setDate(dateString);
    return date;
}
 

Идея здесь состоит в том, чтобы помочь Джексону (который является библиотекой, ответственной за десериализацию json в объект Java) создать экземпляр даты из строки, предоставленной в json.

Комментарии:

1. Привет, спасибо, это помогло мне, но теперь я получаю новую ошибку, я обновил свой вопрос. Не могли бы вы помочь мне и с этим тоже? это ошибка: свойство not-null ссылается на нулевое или переходное значение : com.cbc.coorporateblinddateservice.entities.times.Time.meetingDate