Было бы лучше, если бы вы сохранили каждую опцию индивидуально, а затем сохранили сгенерированный идентификатор на карте.
Я выполнил приведенный ниже тест, и он отлично работает.
@Autowired
void printServiceInstance(QuestionRepository questions, OptionRepository options) {
Question question = new Question();
questions.save(question);
question.add(new Option(-1L, question));
question.add(new Option(-2L, question));
question.add(new Option(-3L, question));
question.add(new Option(-4L, question));
Map<Long, Long> idMap = new HashMap<>();
question.getOptions().stream()
.filter(option -> option.getId() < 0)
.forEach(option -> idMap.put(option.getId(), options.save(option).getId()));
System.out.println(idMap);
}
Выход на консоль: {-1 = 2, -2 = 3, -3 = 4, -4 = 5}
ОБНОВЛЕНО: Или будет лучше код, есливнешний интерфейс просто контролирует порядок опций и получает новые идентификаторы на основе порядка несохраненных опций.
Опция:
@Column(name = "order_num")
private Integer order;
public Option(Long id, Integer order, Question question) {
this.id = id;
this.question = question;
this.order = order;
}
Пример обновления:
@Autowired
void printServiceInstance(QuestionRepository questions, OptionRepository options) {
Question question = new Question();
Question merged = questions.save(question);
merged.add(new Option(-1L, 1, merged));
merged.add(new Option(-2L, 2, merged));
merged.add(new Option(-3L, 3, merged));
merged.add(new Option(-4L, 4, merged));
questions.save(merged);
System.out.println(questions.findById(merged.getId()).get().getOptions());//
}
Выход консоли: [Option [id = 2, order = 1], Option [id = 3, order = 2], Option [id = 4, order =3], Option [id = 5, order = 4]]
Обратите внимание, что карта для управления новыми идентификаторами не нужна, интерфейс должен знать, получая ее в порядке расположения опций.