user3310115
user3310115

Reputation: 1460

How to implement Composite Primary Key in Hibernate?

I have two tables with primary keys questionNumber and assessmentId. I want to use these two to make them composite in two different tables. Is this possible. Should I add something to this to make it work. OR is there another way to implement it. OR should I add question meta data to question and just used the composite key in 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
    }

Upvotes: 1

Views: 239

Answers (1)

Brian Vosburgh
Brian Vosburgh

Reputation: 3276

These are "derived identities", so your mappings should like this:

@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;

    // ...
}

Upvotes: 1

Related Questions