JPA에서 복합키를 매핑하는 방법중 하나, 복합키를 정의하는 별도의 클래스를 사용
복합키를 지정할때 @IdClass 를 사용하여 엔티티와 연결
복합키
두개 이상의 컬럼을 조합하여 기본키로 사용하는 것을 의미
설정 방식
1. 식별자 클래스 정의
- 복합키에 포함될 필드를 정의한 클래스를 작성
2. 엔티티 클래스와 연결
- 엔티티에서 어노테이션을 사용하여 식별자 클래스를 지정하고, 각 필드를 @Id로 선언
예제
테이블 구조 :
Order
---------------------------------
order_id (PK)
product_id (PK)
quantity
식별자 클래스 정의 :
import java.io.Serializable;
import java.util.Objects;
public class OrderId implements Serializable {
private Long orderId;
private Long productId;
// 기본 생성자
public OrderId() {}
public OrderId(Long orderId, Long productId) {
this.orderId = orderId;
this.productId = productId;
}
// equals()와 hashCode()를 반드시 구현해야 함.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
OrderId orderId1 = (OrderId) o;
return Objects.equals(orderId, orderId1.orderId) &&
Objects.equals(productId, orderId1.productId);
}
@Override
public int hashCode() {
return Objects.hash(orderId, productId);
}
// Getters, Setters
}
엔티티 클래스 정의 :
import jakarta.persistence.*;
@Entity
@IdClass(OrderId.class) // 식별자 클래스를 지정
public class Order {
@Id
private Long orderId;
@Id
private Long productId;
private int quantity;
// Getters and Setters
}
중요한 점
1. Serializable 구현 필수
- 식별자 클래스는 Serializable 인터페이스를 구현해야 한다
2. equals() 와 hashCode() 구현
- 식별자 클래스에서 객체 동등성 비교를 위해 equals()와 hashCode() 를 반드시 구현해야 한다
3. 기본 생성자 필수
- 식별자 클래스는 기본 생성자를 가져야 한다
@IdClass 장단점
장점
- 명확한 복합키 정의 : 키를 별도 클래스로 관리하여 복합키 구조를 쉽게 구조를 쉽게 파악 가능
- 관계형 데이터베이스와 유사한 구조 : 테이블의 복합키를 엔티티에 자연스럽게 매핑
단점
- 관리 복잡도 : 키 클래스와 엔티티 간의 관계를 명확히 유지해야 함
- 코드길이 증가 : 추가 클래스와 메서드 구현이 필요
특징 | @IdClass | @EmbeddedId |
키 클래스를 별도로 정의 | O, 단순 POJO로 정의 | O, 반드시 @Embeddable 어노테이션 사용 |
사용 방식 | 엔티티 클래스의 각 필드에 @Id 어노테이션 추가 | 엔티티 클래스에 @EmbeddedId로 통합된 키 사용 |
관리의 용이성 | 데이터베이스 설계와 유사한 구조 | 키를 한번에 관리 가능 |
복잡성 | 조금 더 복잡 | 조금 더 간단 |
@EmbeddedId 간단 예제
@Embeddable
public class OrderId implements Serializable {
private Long orderId;
private Long productId;
// 기본 생성자, equals(), hashCode() 필수
}
@Entity
public class Order {
@EmbeddedId
private OrderId id;
private int quantity;
// Getters and Setters
}
차이점 : @EmbeddedId는 키를 통합된 하나의 필드로 간단히 관리한다
정리
1. 복합키: 여러 컬럼을 조합하여 하나의 기본 키로 설정.
2. @IdClass:
- 식별자 클래스를 별도로 정의하고, 이를 엔티티에 매핑
- @Id를 엔티티의 개별 필드에 적용
3. @EmbeddedId:
- 식별자 클래스를 통합된 하나의 필드로 처리
출처 : ChatGPT
'BE > Java' 카테고리의 다른 글
[Java] Generic 제너릭 (0) | 2025.01.04 |
---|---|
[Java] enum (1) | 2025.01.01 |
[Java] @Builder, @ToString, @EqualsAndHashCode, @Singular (0) | 2024.12.23 |
[Java] 프록시 (0) | 2024.12.22 |
[Java] 쓰레드 (0) | 2024.12.22 |