проблема с двунаправленным отношением oneToMany в Java + spring - PullRequest
0 голосов
/ 28 октября 2018

в проекте Java + Spring, у меня есть эти два класса и код для вставки данных:

@Entity(name = "Quiz")
@Table(name = "quiz")
@PrimaryKeyJoinColumn(name="id")
public class Quiz implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy="quiz", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    private List<QuizQuestion> quizQuestions= new ArrayList<>();


@Entity(name = "QuizQuestion")
@Table(name = "quiz_question")
@PrimaryKeyJoinColumn(name="id")
public class QuizQuestion implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String text;

    @ManyToOne
    @JoinColumn(name = "quiz_id", referencedColumnName="id")
    private Quiz quiz;

Quiz javaQuiz= new Quiz();
javaQuiz.setName("QCM Java");

QuizQuestion qOne= new QuizQuestion();
qOne.setText("where");

List<QuizQuestion> listQJava= new ArrayList<>();
listQJava.add(qOne);

javaQuiz.setQuizQuestions(listQJava);

quizDao.save(javaQuiz);

путем записи теста, у меня в таблице "quiz_question" столбец quiz_id, который всегдаNULL

result in database

Спасибо за помощь!

1 Ответ

0 голосов
/ 28 октября 2018

Как правило, @JoinColumn указывает, что сущность является владельцем отношения, а mappedBy указывает, что сущность является обратной к взаимосвязи.

Итак, если вы пытаетесь выполнить следующие действия

@OneToMany(mappedBy="quiz", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
private List<QuizQuestion> quizQuestions= new ArrayList<>();

Это означает, что она обратна отношению и не будет устанавливать родительскую ссылку на свой дочерний элемент.

Чтобы установить родительскую ссылку на свой дочерний объект, вы должны сделать вышеуказанного владельца сущности отношения следующим:way.

 @OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
 @JoinColumn
 private List<QuizQuestion> quizQuestions= new ArrayList<>();

Вам не нужно устанавливать какие-либо дочерние ссылки, потому что приведенный выше код создаст столбец в дочерней таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...