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