본문 바로가기

게으른개발자/공부

JPA 외래키로 복합키 만들기

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

 

 

JPA 복합키를 사용 하는 방법 2가지

대부분의 엔티티에는 @Id 애노테이션을 한 개 사용한다. 하지만 테이블의 키가 복합키로 이뤄져 있다면 엔티티를 설계할 때에 이를 고려해야 한다. 복합키 설정 방법은 두 가지가 있다. 1. @Embeddab

kimseungjae.tistory.com