복합키
복합키란 두 개 이상의 칼럼을 하나의 key로 지정하는 것을 말한다.
PK(기본키)는 한 테이블에 하나만 존재해야 하는데, 꼭 한 테이블에 칼럼 하나만을 기본키로 지정할 수 있는 것은 아니다.
복합키 설정
CREATE TABLE student (
id bigint primary key,
name varchar primary key
);
위와 같이 SQL 구문을 작성하게 되면 오류가 발생한다.
CREATE TABLE student (
id bigint not null,
name varchar not null,
primary key(id, name)
);
위와 같은 구문을 작성하게 되면 id, name 칼럼을 동시에 사용하는 복합기본키로 사용할 수 있게 된다.
주의사항
복합키가 적용된 테이블에 데이터를 삽입을 할 경우에는 복합키로 사용되는 칼럼의 조합이 UNIQUE 해야 한다.
student 테이블에 id=1, name="kim"인 데이터가 있다고 가정해 보자.
이 상황에서 id=1, name="kim"인 데이터를 다시 삽입하려고 하면 당연히 에러가 발생하지만 id=2, name="kim"인 데이터는 정상적으로 삽입이 되는 것을 볼 수 있다.
name 칼럼이 중복되지만 id 칼럼과 같이 보게 되면 기존과 비교하여 새로운 조합의 복합키가 되었으므로 문제없이 삽입이 된다.
INSERT into student (id, name) VALUES (1, "kim");
Query OK, 1 row affected (0.00 sec)
INSERT into student (id, name) values(1, "kim");
ERROR 1062 (23000): Duplicate entry '1-kim' for key 'student.PRIMARY'
INSERT into student (id, name) values(2, "kim");
Query OK, 1 row affected (0.00 sec)
복합키 in JPA
먼저 복합키를 가지고 있는 테이블을 Entity를 만들어준다.
package test.entity;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Data;
@Entity
@Table(name = "STUDENT")
public class Student {
@Id
private int id;
@Id
private String name;
private int grade;
private String department;
}
하지만 이렇게 만들게 되면 고유키가 두 개가 되므로 오류가 발생하게 된다.
이 경우엔 id, name을 따로 sutdentId로 객체화를 시켜주고 @EmbeddedId를 붙여주면 된다.
@Embeddable
@EqualsAndHashCode
@Data
public class StudentId implements Serializable {
private int id;
private String name;
}
@Entity
@Table(name = "STUDENT")
public class Student {
@EmbeddedId
private StudentId id;
private int grade;
private String department;
}
@Embeddable, EmbeddedId
객체지향적인 방법으로서, 지정하고자 하는 칼럼들을 하나의 객체로 묶어서 해당 객체에 @Embeddable 어노테이션을 붙여준다.
- Embeddable - 이 클래스는 클래스에 포함될 수 있다.
- EmbeddedId - 이 클래스는 Id로 사용된다.
@EqualsAndHashCode
영속성 콘텍스트는 기본적으로 엔티티의 식별자를 key로 사용해서 엔티티를 관리하고, 식별자를 비교할 때 equals()와 hashCode()를 사용하기 때문에 동등성이 지켜져야 한다.
따라서 복합 키는 해당 어노테이션을 붙여 equals()와 hashCode()를 필수로 구현해야 한다.
동등성과 동일성 : https://skroy0513.tistory.com/72
참조
https://gaemi606.tistory.com/entry/Composite-Key-%EB%B3%B5%ED%95%A9-%ED%82%A4
'멋진 개발자 > DB' 카테고리의 다른 글
개발자 성장 기록 59 - ACID (0) | 2024.05.08 |
---|---|
개발자 성장 기록 57 - 캐시 (0) | 2024.05.03 |
개발자 성장 기록 56 - JOIN (0) | 2024.04.25 |
개발자 성장 기록 50 - 인덱스(Index) (0) | 2024.04.17 |
개발자 성장 기록 49 - Oracle과 MySQL (0) | 2024.04.16 |