티스토리 뷰
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;
}
'Spring' 카테고리의 다른 글
[Spring]@No/All/RequiredArgsConstructor (0) | 2024.09.12 |
---|---|
[Spring Data JPA]JPA Repository란? (+ 사용법, Method) (0) | 2024.09.10 |
[Spring]IoC Container (0) | 2024.09.09 |
[Spring]DI(Dependeny Injection) - 의존 관계 주입 (0) | 2024.09.09 |
[Spring]@Controller와 @RestController의 차이 (0) | 2024.09.03 |
- Total
- Today
- Yesterday