본문 바로가기
스프링/JPA

복합키

by 공부 안하고 싶은 사람 2021. 5. 26.
반응형

 

  @EmbededId @IdClass
장점 - 객체지향적이다. (예제의 shopNumber 컬럼체크) - @MapsId를 이용한 객체생성 편리 - 비즈니스적으로 의미있는 PK 값이라면 명시적으로 필드를 노출할 수 있다. - 식별관계 매핑을 여러 테이블에서 사용할때, 객체 연관관계를 단순하게 유지 가능
단점 - 복합키구조가 2개이상 테이블에 식별관계로 매핑이 될때 복잡도가 증가한다. - 컬럼에 대한 필드선언이 중복이 발생한다. - @MapsId 활용이 불가능하여 객체 생성할때 주의를 요함

 

단순한 하나의 복합키만 존재한다고 하면 @EmbededId

 

복합키를 통한 식별관계 매핑이 여기저기 존재한다면 @IdClass

 

이는 중복을 조금더 허용하더라도 Legacy Table 의 설계 의도를 Entity 에 녹여서 명시적인 객체구조를 가질 수 있어 기존의 운영중이 테이블과 이질감이 줄어들게된다.

 

 

@EmbededId

@EmbededId를 사용한 객체를 연관관계로 가지며, 그 객체가 @Embeddable을 가지고 Serializable을 상속받음

@Data
@Embeddable
class EmpId implements Serializable {
    @Column(name = "EMP_NO")
    private int empNo;
    @Column(name = "EMP_NAME")
    private String empName;
}

@Entity
class Emp {
    @EmbeddedId
    private EmpId empId;
    private String phone;
}

 

 

@IdClass

@IdClass(상속테이블명.class)를 가지면, 해당 상속테이블의 컬럼명과 같은 컬럼들을 @Id컬럼으로 사용하는 구조

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

@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;
}
  • 등록된 PK.class를 다른 Entity,Repository에 적용할 수 있다.(재사용)
728x90
반응형

댓글