먼저 기본 entity Class 외에 복합 기본키를 표현하기 위한 PK Class를 정의해야 한다.
그리고 PK Class는 아래의 조건을 만족해야한다.
- PK Class는 public이어야하고 public no-arg 생성자.
- property-based 접근이 사용될 경우, 해당 properties도 public or protected.
- implements <Serializable>
- equals 및 hashCode 메소드를 정의, 구현 해야한다. 해당 메소드의 결과는 Database의 동일성 Check 결과와 같아야 한다.
- 복합 기본 키는 (@EmbeddedId, @IdClass) 어노테이션으로 표현한다.
> PK Class를 생성
package com.xx.entity; import java.io.Serializable; /** * The primary key class for the xx database table. */ //@Embeddable = EmbeddedId 경우 필요 public class xxPK implements Serializable { //default serial version id, required for serializable classes. private static final long serialVersionUID = 1L; private String createdate; private int cultcode; public xxPK() { } public String getCreatedate() { return this.createdate; } public void setCreatedate(String createdate) { this.createdate = createdate; } public int getCultcode() { return this.cultcode; } public void setCultcode(int cultcode) { this.cultcode = cultcode; } public boolean equals(Object other) { ... } public int hashCode() { ... } }
> Entity Class에서의 사용
@EmbeddedId
@Entity class Time implements Serializable { @EmbeddedId private xxPK PK; private String src; private String dst; private Integer distance; private Integer price; //... }
@IdClass
@Entity @IdClass(xxPK.class) class Time implements Serializable { @Id private String createdate; @Id private int cultcode; private String src; private String dst; private Integer distance; private Integer price; // getters, setters }
> 차이점
- 물리적 모델 관점에서 차이점은 없음
- @EmbeddedId는 결합 된 pk가 의미있는 엔티티 자체이거나 코드에서 재사용 될 때 의미가 있음을보다 분명하게 전달한다.
- @IdClass는 필드의 일부 조합이 고유하지만 특별한 의미가 없을 경우 유용
> 기타
- IDE(Eclipse)에서 JPA – Facet 을 통해 Entity Class를 자동 생성 할 경우 @EmbeddedId 를 사용하는 방식으로 PK Class까지 자동 생성된다.
- JSON 등 기타 Mapping 이 필요하거나 Table과 비교 등 직관적으로 잘 인지 할 수 있는건 @IdClass 로 생각된다.