티스토리 뷰

Spring JPA의 엔티티 대부분은 @Id 어노테이션을 1개 씩만 갖는 단일 키 구조를 띄고 있습니다.

하지만, 필요에 따라 단일키가 아닌 복합키로 기본 키를 설정해야 할 때가 있습니다. 이번에는 JPA를 통해 복합키를 지정하는 방법을 알아보겠습니다.

Spring JPA에서 복합키를 지정하는 방법에는 2가지가 있습니다.

  • @EmbeddedId을 사용하는 방식 (→ 객체 지향 방식에 가깝습니다.)
  • @IdClass을 사용하는 방식 (→ DB방식에 가깝습니다.?)

 

@EmbeddedId

다음과 같이 기본키가 (emp_name, emp_no)의 복합키로 이루어진 emp 테이블이 있습니다.

create table emp (
    emp_name varchar(255) not null,
    emp_no integer not null,
    name varchar(255),
    primary key (emp_name, emp_no)
)

 

 

@EmbeddedId를 이용하여 엔티티를 설계할 때는 우선 Serializable 인터페이스를 구현한 클래스를 선언하고 필드에 복합키로 사용되는 Column을 선언하면 됩니다. 그리고 반드시 @Embeddable 어노테이션을 추가해야 합니다.

@Data
@Embeddable
public class EmpId implements Serializable {
	@Column(name = "EMP_NO")
	private String emp_name;
	
	@Column(name = "EMP_NAME")
	priavete int emp_no;
}

이때 반드시 @Column을 통해 매핑을 해주어야 합니다.

 

이제 복합키에 대한 클래스를 생성했으니 이를 엔티티와 결합시켜야 합니다.

Emp 엔티티 클래스 내부에 복합키를 위해 생성한 EmpId를 객체 연관 관계로 설정하면 됩니다. 

그리고 @EmbeddedId 어노테이션을 붙여주면 됩니다.

@Entity
class Emp{
	@EmbaddedId
	private EmpId empId;
	
	@Column(nullable = false)
	private String name;
	
}

@IdClass

기본키로 (order_id, product_id)의 복합키를 가진 order_product 테이블이 있습니다.

create table order_product (
    order_id integer not null,
    product_id integer not null,
    amount integer not null,
    primary key (order_id, product_id)
)

 

 

@IdClass도 @EmbeddedId와 마찬가지로 Serializable 인터페이스를 구현한 클래스를 선언하고 필드를 정의합니다.

@Data
class OrderProductPK implements Serializable{
	private int orderId;
	private int productId;
}

 

위와 같이 정의한 후, 엔티티 클래스에 @IdClass(OrderProduckPK.class) 설정을 추가해 주면 됩니다.

여기서 유의해야 할 점은 OrderProduct 엔티티 클래스의 식별자 orderId, productId 필드 이름은 OrderProductPK의 필드 이름과 동일해야 합니다.

@Data
@Entity
@IdClass(OrderProductPK.class)
class OrderProduct {
	@Id
	@Column(name = "ORDER_ID")
	private int orderId;
	
	@Id
	@Column(name = "PRODUCT_ID")
	private int productId;
	
	private int amount;
}

 

공지사항
최근에 올라온 글
Total
Today
Yesterday