外键引用Spring Boot中的主键

时间:2019-04-11 06:29:07

标签: java database spring-boot database-design java-annotations

  1. 我正在添加MCQ问题,选项和答案。

  2. 有三个表QuestionOptionAnswer

下面是我的数据库架构

  1. questionId(问题表)是主键,questionId(选项表)是外键。

  2. questionId(问题表)是主键,questionId(答案表)是外键。

  3. 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

1 个答案:

答案 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>