Spring JPA neukládá vazbu na rodiče

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

Napsat komentář