JPA-entity 복합PK 맵핑 (@EmbeddedId, @IdClass)

먼저 기본 entity Class 외에 복합 기본키를 표현하기 위한 PK Class를 정의해야 한다.

그리고 PK Class는 아래의 조건을 만족해야한다.

  1. PK Class는 public이어야하고 public no-arg 생성자.
  2. property-based 접근이 사용될 경우, 해당 properties도 public or protected.
  3. implements <Serializable>
  4. equals 및 hashCode 메소드를 정의, 구현 해야한다.  해당 메소드의 결과는 Database의 동일성 Check 결과와 같아야 한다.
  5. 복합 기본 키는 (@EmbeddedId, @IdClass) 어노테이션으로 표현한다.

 

> PK Class를 생성

 

> Entity Class에서의 사용

@EmbeddedId

 

@IdClass

 

> 차이점

  1. 물리적 모델 관점에서 차이점은 없음
  2. @EmbeddedId는 결합 된 pk가 의미있는 엔티티 자체이거나 코드에서 재사용 될 때 의미가 있음을보다 분명하게 전달한다.
  3. @IdClass는 필드의 일부 조합이 고유하지만 특별한 의미가 없을 경우 유용

 

> 기타

  1. IDE(Eclipse)에서 JPA  – Facet 을 통해 Entity Class를 자동 생성 할 경우 @EmbeddedId 를 사용하는 방식으로 PK Class까지 자동 생성된다.
  2. JSON 등 기타 Mapping 이 필요하거나 Table과 비교 등 직관적으로 잘 인지 할 수 있는건 @IdClass 로 생각된다.