Сохранение объектов с отношением @ManyToOne в Spring JPA

#java #jpa #spring-data-jpa

#java #jpa #spring-data-jpa

Вопрос:

У меня есть сущность Request :

 @Entity
public class Request {

    @Id
    @GeneratedValue
    private Long id;

    private Long candidate;

    @ManyToOne
    private ExamSchedule examSchedule;

...

 

Кроме того, ExamSchedule :

 @Entity
public class ExamSchedule {

    @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private Instant start;

    @NonNull
    private Instant end;

...

 

Теперь, чтобы сохранить Request вместе с ExamSchedule :

  1. Я буду проверять, присутствует ли расписание экзаменов для данного запроса.
  2. Если да, сохраните новые Request , связав с существующими ExamSchedule
  3. Если нет, сохраните new Request , связав с вновь созданным ExamSchedule

Во втором приведенном выше случае он связывает вновь созданные ExamSchedule с Request . Здесь ожидается, что он не должен создавать новый экземпляр ExamSchedule и использовать существующий.

Пожалуйста, дайте мне знать, чего здесь может не хватать. Спасибо.

 
Optional<ExamSchedule> scheduleOptional = examScheduleRepository
                .findByStartAndEnd(schedule.getStart(), schedule.getEnd());

        ExamSchedule examSchedule = scheduleOptional
                .orElse(examScheduleRepository.save(schedule));

        Request request = new Request(scribe.getId(), candidate.getId(), examSchedule);
        return requestRepository.save(request);

 

Ответ №1:

Это была глупая ошибка. orElse of optional выполняет свой параметр независимо от того, является ли optional пустым или нет. Мне нужно было использовать orElseGet . Это обеспечивает Supplier в качестве входных данных, которые выполняются только тогда, когда необязательный параметр пуст.

 ExamSchedule examSchedule = scheduleOptional.orElseGet(() -> examScheduleRepository.save(schedule));