Java hibernate中的映射混淆

Java hibernate中的映射混淆,java,hibernate,Java,Hibernate,我目前有3张评估表、问题表和问题选项表。每个评估都有一些问题,每个问题都有一些问题选项。最初我用这些的@OneToMany映射开始我们的工作,但后来由于我拥有的字段,我不得不使用有问题的复合键,所以整个映射都发生了变化。我对目前的状况不满意。有人能帮我绘制这些表吗 我必须这样做的主要原因是,在指导问题时,我意识到在多个评估中,问题编号可以是相同的。所以我用questionNumber+assessmentId把它做成了一个复合键。问题选项的思维过程也是一样的。相同的问题选项可以存在于不同的问题中

我目前有3张评估表、问题表和问题选项表。每个评估都有一些问题,每个问题都有一些问题选项。最初我用这些的
@OneToMany
映射开始我们的工作,但后来由于我拥有的字段,我不得不使用有问题的复合键,所以整个映射都发生了变化。我对目前的状况不满意。有人能帮我绘制这些表吗

我必须这样做的主要原因是,在指导问题时,我意识到在多个评估中,问题编号可以是相同的。所以我用questionNumber+assessmentId把它做成了一个复合键。问题选项的思维过程也是一样的。相同的问题选项可以存在于不同的问题中。如何才能避免这种情况并保持简单

评估

@Entity
@JsonIgnoreProperties({"questionList"})
public class Assessment {

    @Id
    private String assessmentId;

    private String assessmentTopic;

    private String assessmentSubTopic;

    private String assessmentLevel;

    private String createdBy;

    private String rating;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "assessment", fetch = FetchType.LAZY)
    private List<Question> questionList;
 //Getters and setters
}
问题评估键-组合键

@Embeddable
public class QuestionAssessmentKey implements Serializable {

    private int questionNumber;

    private String assessmentId;
 //Getters and setters
}
问题选项

@Entity
public class QuestionOption {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int questionOptionId;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
            @JoinColumn(name="assessmentId", referencedColumnName = "assessmentId"),
            @JoinColumn(name="questionNumber", referencedColumnName = "questionNumber")
    })
    private Question question;

    private Character questionOption;

    private String questionOptionText;

  //Getters and Setters
}

好的,只需为所有实体使用一个自动生成的技术ID,并将问题编号作为问题的常规字段,就像任何其他字段一样。@JBNizet是正确的。此外,您还可以在questionNumber和assessmentId周围引入一个唯一的约束来强制执行数据。如果我有疑问的questionNumber和assessmentId,以及一个单独的questionAutoId,它是一个autogen id,那么在哪个字段上我应该有OnJetomy映射到问题选项。您不应该有assessmentId。你应该有一个多对一的关联,使你的一对一成为双向的,或者根本没有任何东西使它成为单向的。和关联应该由ID映射。阅读Hibernate文档,看看OneToMany、单向和双向是如何实现的。因此,你的基本意思是我应该在
评估中使用
@OneManyList
,在
问题中使用
@manytone评估。类似地,
问题
中的
@OneToMay列表
问题选项
中的
@manytone问题
@Entity
public class QuestionOption {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int questionOptionId;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
            @JoinColumn(name="assessmentId", referencedColumnName = "assessmentId"),
            @JoinColumn(name="questionNumber", referencedColumnName = "questionNumber")
    })
    private Question question;

    private Character questionOption;

    private String questionOptionText;

  //Getters and Setters
}