Pokud používáte Spring JPA a nedochází k ukládání vazeb na rodiče (potomek je uložen, ale foreign key na rodiče je null), chyba může být v tom, jak máte vytvořeny vazby. Pokud totiž používáte bidirectional (oboustrannou) vazbu (rodič ví o potomkovi a potomek ví o rodiči), může vám chybě právě jedna strana vazby.
Ukážu to na příkladu rodičovské entity Quiz a potomků QuizQuestion.
@Entity(name = "t_quiz")
public class Quiz extends BaseEntity {
@OneToMany(mappedBy = "quiz", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<QuizQuestion> questions = new HashSet<>();
...
}
@Entity(name = "t_quiz_question")
public class QuizQuestion extends BaseEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "quiz_id")
private Quiz quiz;
...
}
Nyní si vytvoříme entitu Quiz s kolekci QuizQuestions a uložíme jej.
final Quiz quiz = new Quiz();
final Set<QuizQuestion> quizQuestions = new HashSet<>();
for (int i = 0; i < 5; i++) {
quizQuestion.add(new QuizQuestion());
}
quiz.setQuestions(quizQuestions);
repository.save(quiz);
Quiz se nám uloží, uloží se i otázky, ale jejich foreign key bude null. Jedná se o bidirectional vazbu, takže musíme naplnit i tu druhou stranu (QuizQuestion musí mít vazbu na Quiz).
for (int i = 0; i < 5; i++) {
final QuizQuestion question = new QuizQuestion()+
question.setQuiz(quiz);
quizQuestion.add(question);
}