JPA 복합 키를 사용하려면 별도의 식별자 클래스를 만들어야 한다.
@EmbeddedId 를 적용한 식별자 클래스는 다음 조건을 만족해야 한다.
- @EmbeddedId 어노테이션을 붙여줘야 한다.
- Serializable 인터페이스를 구현해야 한다.
- 기본 생성자가 있어야 한다.
- 식별자 클래스는 public 이어야 한다.
//예제
@Embeddable
public class RobotId implements Serializable {
private Long armId;
private Long bodyId;
private Long headId;
private Long legId;
}
그리고 해당 복합키를 외래키로 구성을 하기를 원한다면 아래와 같이 @MapsId 어노테이션(https://goslim56.tistory.com/18) 을 활용하면 된다.
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class Robot {
@EmbeddedId
private RobotId robotId;
@ManyToOne(optional = false)
@JoinColumn(name = "arm_id")
@MapsId("armId")
private Arm arm;
@ManyToOne(optional = false)
@JoinColumn(name = "body_id")
@MapsId("bodyId")
private Body body;
@ManyToOne(optional = false)
@JoinColumn(name = "head_id")
@MapsId("headId")
private Head head;
@ManyToOne(optional = false)
@JoinColumn(name = "leg_id")
@MapsId("legId")
private Leg leg;
}
위와 같은 방식으로 Entity 구성시 아래와 같이 query 들이 발생하며 외래키로 복합키가 설정이 된다.
create table arm (
id bigint generated by default as identity,
primary key (id)
)
create table body (
id bigint generated by default as identity,
primary key (id)
)
create table head (
id bigint generated by default as identity,
primary key (id)
)
create table leg (
id bigint generated by default as identity,
primary key (id)
)
create table robot (
arm_id bigint not null,
body_id bigint not null,
head_id bigint not null,
leg_id bigint not null,
primary key (arm_id, body_id, head_id, leg_id)
)
alter table robot
add constraint FK909jocvsbg6nahoe7yxuasamv
foreign key (arm_id)
references arm
alter table robot
add constraint FK35f1sxqqx1uluvptvvqyh2kjj
foreign key (body_id)
references body
alter table robot
add constraint FKeesgm8a0mngj0hlcleldvwiv1
foreign key (head_id)
references head
alter table robot
add constraint FKoa0onitnb7qwjajilijkh9xop
foreign key (leg_id)
references leg
참조:
https://www.baeldung.com/jpa-composite-primary-keys
https://kimseungjae.tistory.com/12
'게으른개발자 > 공부' 카테고리의 다른 글
SSH 터널링을 통한 데이터베이스 백업 방법 (0) | 2022.07.16 |
---|---|
JPA 를 사용하여 JSON 문자열을 객체에 매핑하기 (0) | 2021.12.14 |
@Query Annotation 사용시 null 매개변수 무시하는 방법 (0) | 2021.11.22 |
JPA 외래키를 기본키로 사용하기 (0) | 2021.11.22 |
트랜잭션 (0) | 2021.04.17 |