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를 생성

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
}

 

> 차이점

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

 

> 기타

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

답글 남기기

이메일 주소는 공개되지 않습니다.