✅ When a primary key is composite, it means it consists of two or more columns together forming the unique identifier → no single column is enough to uniquely identify the row, but the combination is.
🔹 How does a composite primary key look in SQL?
Example: Suppose you have an enrollment
table representing students enrolled in courses. The combination of student_id
and course_id
uniquely identifies each enrollment:
CREATE TABLE enrollment (
student_id BIGINT NOT NULL,
course_id BIGINT NOT NULL,
enrollment_date DATE,
grade VARCHAR(10),
PRIMARY KEY (student_id, course_id), -- composite primary key
FOREIGN KEY (student_id) REFERENCES student(id),
FOREIGN KEY (course_id) REFERENCES course(id)
);
🔹 What does it mean?
✅ Neither student_id
nor course_id
alone guarantees uniqueness.
✅ But together (student_id, course_id)
ensures one student can enroll only once in a given course, avoiding duplicate enrollments.
🔹 How does the database enforce it?
- The DBMS creates a unique index on the pair
(student_id, course_id)
→ duplicate combinations are rejected. - Both columns are marked as not null, since primary key columns cannot contain nulls.
🔹 What does the data look like?
student_id | course_id | enrollment_date | grade |
---|---|---|---|
1 | 100 | 2024-09-01 | A |
2 | 100 | 2024-09-01 | B |
1 | 101 | 2024-09-02 | A- |
✅ You can see student_id=1
can appear multiple times, but never twice with the same course_id
.
🔹 How do you map this in Hibernate?
Using @EmbeddedId
or @IdClass
🔹 Example composite PK class for Hibernate with @Embeddable
:
@Embeddable
public class EnrollmentId implements Serializable {
private Long studentId;
private Long courseId;
// equals() and hashCode() required
}
And entity:
@Entity
public class Enrollment {
@EmbeddedId
private EnrollmentId id;
private String grade;
}
✅ Key takeaway:
A composite primary key uses two or more columns together as the unique identifier, ensuring no duplicates of the combination — it’s common for join or link tables representing many-to-many relationships (e.g., enrollment).