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); }