如何在Hibernate中实现复合主键

  • 本文关键字:复合 实现 Hibernate java jpa
  • 更新时间 :
  • 英文 :


我有两个表,主键是questionNumber和assessmentId。我想用这两个来将它们组合在两个不同的表中。这可能吗。我应该添加一些内容使其工作吗。或者还有其他方法可以实现它吗?或者我应该在问题中添加问题元数据,并且只在AnswerKey中使用复合密钥吗

Question
@Entity
@Getter
@Setter
public class Question implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int questionId;
private int questionNumber;
private String assessmentId;
private QuestionTypes questionType;
private String questionText;
private String questionURL;
private QuestionStatus questionStatus;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "questionNumber", referencedColumnName = "questionNumber")
private List<QuestionOption> questionOptions;
//Constructor
// Getter and setter
}
Assessment
@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 = "assessmentId", fetch = FetchType.LAZY)
private List<Question> questionList;
//Constructor
//Setter and getter
}

QuestionMetaData

@Entity
public class QuestionMetaData {
@Id
private QuestionAssessmentKey questionAssessmentKey;
private String topicName;
private String subtopicName;
private QuestionComplexity complexity;
private String conceptName;
//Getter and setter
//Constructor
}
AnswerKey

@Entity
public class AnswerKey {
@Id
private QuestionAssessmentKey questionAssessmentKey;
private Character answer;
//Constructor
// Setter and getter
}

Key
@Embeddable
public class QuestionAssessmentKey implements Serializable {
private int questionNumber;
private String assessmentId;
//Constructor
//Setter and Getter
}

这些是"派生身份",所以映射应该是这样的:

@Entity
public class Assessment {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
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;
// ...
}
@Entity
public class Question implements Serializable {
@EmbeddedId
private QuestionAssessmentKey questionAssessmentKey;
@ManyToOne
@MapsId("assessmentId") // maps assessmentId attribute of embedded id
private Assessment assessment;
private QuestionTypes questionType;
private String questionText;
private String questionURL;
private QuestionStatus questionStatus;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "questionNumber", referencedColumnName = "questionNumber")
private List<QuestionOption> questionOptions;
// ...
}
@Entity
public class QuestionMetaData {
@EmbeddedId
private QuestionAssessmentKey questionAssessmentKey;
private String topicName;
private String subtopicName;
private QuestionComplexity complexity;
private String conceptName;
@ManyToOne
@MapsId("assessmentId") // maps assessmentId attribute of embedded id
private Assessment assessment;
// ...
}
@Entity
public class AnswerKey {
@EmbeddedId
private QuestionAssessmentKey questionAssessmentKey;
private Character answer;
@ManyToOne
@MapsId("assessmentId") // maps assessmentId attribute of embedded id
private Assessment assessment;
// ...
}
@Embeddable
public class QuestionAssessmentKey implements Serializable {
private String assessmentId;
private int questionNumber;
// ...
}

最新更新