在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列始终为空
谢谢您的帮助!
答案 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<>();
您无需设置任何子引用,因为上面的代码将在子表中创建一列。