BE/Java

[Java] @IdClass

baek-dev 2024. 12. 31. 12:32

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