代码之家  ›  专栏  ›  技术社区  ›  user3310115

如何在休眠中实现复合主键?

  •  1
  • user3310115  · 技术社区  · 6 年前

    我有两张表,上面有主键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
        }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Brian Vosburgh    6 年前

    这些是“派生标识”,因此映射应如下所示:

    @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;
    
        // ...
    }