티스토리 뷰

Framework/Spring

[JPA] Composite Key

DUCKBAE's 2022. 7. 22. 00:14

Composite Key란 테이블의 기본 키를 두가지 컬럼의 조합한 것이다.

이번 실무에서 두 가지 컬럼을 조합하여 PK를 구성하라는 요청사항이 들어왔다😱

 

활용

  • @IdClass
  • @EnbeddedId

규칙

(Composite Key를 정의하기 위한 규칙이다)

  • 인수가 없는 생성자가 있어야 한다.
  • 직렬화가 가능해야 한다.
  • equals(), hashCode() 함수가 정의되어야 한다.
  • Composite Key 클래스는 Public이어야 한다.

 

@IdClass 활용

@EqualsAndHashCode
@NoArgsConstructor
public class UserId implements Serializable {
    
    private Long id;

    private String lastName;
}
@Getter
@Table
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@IdClass(UserId.class)
public class User implements Serializable {

    @Id
    private Long id;

    @Id
    private String lastName;

    private String firstName;

    private LocalDateTime createdAt;
}

 

@Embedded 활용

@Getter
@EqualsAndHashCode
@NoArgsConstructor
@Embeddable
public class UserId implements Serializable {
    
    private Long id;

    private String lastName;
}
@Getter
@Table
@Entity
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

    @EmbeddedId
    private UserId userId;

    @Column(unique = true)
    private String firstName;

    private LocalDateTime createdAt;
}

 

비교

JPQL에서 영향을 준다.

 

JPQL 예시

-- use @IdClass
SELECT u.id, u.lastName FROM user u

-- use @EmbeddedId
SELECT u.userId.id, u.userId.lastName FROM user u

@IdClass 사용 시 composite key 에 바로 접근이 가능하고,

@EmbeddedId 사용 시 composite key를 정의한 객체를 참조하여 접근한다.

 

그럼 어떤 방식을 사용하는 것이 좋을까?

해당 식별자(여기에서 UserId 클래스를 의미)가 의미가 있어 객체로 자주 사용(다른 곳에서도 사용) 된다고 하면 @EmbeddedId를,

복합키로만 존재한다고 하면 @IdClass 를 사용하면 된다.

 

참고

https://www.baeldung.com/jpa-composite-primary-keys

'Framework > Spring' 카테고리의 다른 글

[JPA] JPA  (0) 2022.08.08
[JPA] View Table  (0) 2022.07.28
[Spring] JUnit  (0) 2022.07.20
[Spring] EnvironmentPostProcessor  (0) 2022.07.13
[Spring] AOP  (0) 2022.06.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함