Java + spring中双向oneToMany关系的问题

时间:2018-10-27 21:13:18

标签: spring jpa java-ee

在Java项目+春季中,我有这两个类和一个用于插入数据的代码:

@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列始终为空

result in database

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

通常,@ JoinColumn表示该实体是该关系的所有者,而mappingBy表示该实体是该关系的逆向。

因此,如果您尝试按照以下步骤操作

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

这意味着它与关系成反比,并且不会将父级引用设置为其子级。

要将父级引用设置为其子级,您必须通过以下方式使关系具有上述实体所有者。

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

您无需设置任何子引用,因为上面的代码将在子表中创建一列。