SMALL

Entity를 생성하다 보면 PK(primary key)가 여러 개가 되는 경우가 발생한다.

이러한 경우에 어떠한 방식으로 Entity를 작성해야 하는지 알아보도록 하자.

 

JPA에서는 두 가지 방식을 제공한다.

@IdClass, @EmbeddedId

각각의 사용법과 특징을 알아보도록 하자.

 

@IdClass

@Getter
@NoArgsConstructor
@Entity
@IdClass(MemberId.class)
public class Member {
	@Column
	private String name;
	
	@Id
	@Column
	private String teamId;
	
	@Id
	@Column
	private String teamName;
}

복합키가 존재하는 Entity에 @IdClass Annotation을 추가해주고, 복합키를 설정할 class명을 정해준다.

또한, 복합키로 지정할 컬럼에 @Id Annotation을 추가한다.

 

@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@NoArgsConstructor
public class MemberId implements Serializable {

	private static final long serialVersionUID = 5735022999922182249L;

	@EqualsAndHashCode.Include
	public String teamId;
	
	@EqualsAndHashCode.Include
	public String teamName;
}

IdClass의 작성시 지켜야 할 사항들이 존재한다.

  • Serializable을 implements 받아야 한다.
  • equal, hashCode method를 구현해야 한다. 위의 예제에서는 lombok을 이용하였다.
  • 기본 생성자가 존재해야 한다.
  • public class 이여야 한다.
  • Entity Class의 필드명과 동일한 필드를 가지고 있어야 한다. 

 

public interface MemberRepository extends JpaRepository<Member, MemberId>{

}

Repository를 작성 시에는 JpaRepository의 제너릭 타입에 Entity Class와 Entity Class의 Key값을 넣는데 복합키를 사용한 경우에는 위와 같이 넣어주어야 한다.

 

@EmbeddedId

@Getter
@NoArgsConstructor
@Entity
public class Member {
	@Column
	private String name;
	
	@EmbeddedId
	private MemberId memberId;
}

 

@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@NoArgsConstructor
@Embeddable
public class MemberId implements Serializable {

	private static final long serialVersionUID = 5735022999922182249L;

	@EqualsAndHashCode.Include
	public String teamId;
	
	@EqualsAndHashCode.Include
	public String teamName;
}

 

이렇게 두 가지의 형식이 존재하는데 각각의 선언하는 방식도 다르지만 실제로 쿼리를 조회한 후에 값을 조회할 때도 차이가 존재한다.

 

@IdClass의 경우에는 member.getTeamId()와 같이 사용

@EmbeddedId의 경우에는 member.getMemberId().getTeamId()와 같이 사용해야 한다. 

LIST

+ Recent posts