我正在添加MCQ问题,选项和答案。
有三个表Question
,Option
和Answer
。
下面是我的数据库架构
questionId(问题表)是主键,questionId(选项表)是外键。
questionId(问题表)是主键,questionId(答案表)是外键。
optionId(选项表)是主键,而optionId(答案表)是外键。
我无法链接主键和外键-请帮助我进行改进。
问题表:
@Entity
@Table(name = "mcq_question")
public class Question {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JoinColumn (name = "questionId")
private Long questionId;
@Column(nullable = false)
private String question;
@OneToOne(fetch = FetchType.LAZY)
@JoinTable( name = "Answer", joinColumns = @JoinColumn ( name = "question_id"), inverseJoinColumns = @JoinColumn( name = "option_id"))
private List <Option> options;
@OneToMany(mappedBy = "questionId", cascade = CascadeType.ALL)
private Set<Option> option;
public Question() { }
public Long getMcqId() {
return questionId;
}
public void setMcqId(Long mcqId) {
this.questionId = mcqId;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
@Override
public String toString() {
return "SessionMcqModel{" +
"mcqId=" + questionId +
", question='" + question + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Question question1 = (Question) o;
return questionId.equals(question1.questionId) &&
question.equals(question1.question) &&
options.equals(question1.options) &&
option.equals(question1.option);
}
@Override
public int hashCode() {
return Objects.hash(questionId, question, options, option);
}
}
答案表:
@Entity
@Table(name = "mcq_Options")
public class Option {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "option_id")
private int optionId;
private String option;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn
private Question questionId;
public Option() { }
public Option(String option, Question questionId) {
this.option = option;
}
public int getOptionId() {
return optionId;
}
public void setOptionId(int optionId) {
this.optionId = optionId;
}
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
public Question getQuestionId() {
return questionId;
}
public void setQuestionId(Question questionId) {
this.questionId = questionId;
}
@Override
public String toString() {
return "Option{" +
"optionId=" + optionId +
", option='" + option + '\'' +
", questionId=" + questionId +
'}';
}
}
错误:
由以下原因引起:org.hibernate.AnnotationException:com.bluepi.TrainingProject.model.Question.options上的@OneToOne或@ManyToOne引用了一个未知实体:java.util.List
答案 0 :(得分:2)
问题出在stateValidator(control: AbstractControl): any {
let mandatory:boolean=false;
if(control.parent){
console.log('control',<FormGroup>control.parent.controls.isMandatory.value);
mandatory=<FormGroup>control.parent.controls.isMandatory.value;
}
if((typeof control === 'undefined' || control === null
|| typeof control.value === 'undefined' || control.value === null)&& mandatory) {
debugger;
return {
required: true
}
}
const stateName: string = control.value.trim();
let isPrimaryControl: AbstractControl=null;
if(control.parent){
isPrimaryControl=<FormGroup>control.parent.controls.isMandatory;
console.log(isPrimaryControl)
}
if(typeof isPrimaryControl === 'undefined' || isPrimaryControl === null||typeof isPrimaryControl.value === 'undefined' || isPrimaryControl.value === null) {
return {
invalidFlag: true
}
}
const isPrimary: boolean = isPrimaryControl.value;
if(isPrimary === true) {
if(stateName.length < 3) {
return {
minLength: true
};
} else if(stateName.length > 50) {
return {
maxLength: true
};
}
} else {
control.setValue('');
}
return null;
}
和Question
之间
Option
您正在尝试将列表映射到不正确的1-1关系,您可能想使用的是使用@OneToOne(fetch = FetchType.LAZY)
@JoinTable( name = "Answer", joinColumns = @JoinColumn ( name = "question_id"), inverseJoinColumns = @JoinColumn( name = "option_id"))
private List <Option> options;
批注而不是@OneToMany
的1-N关系< / p>