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
'Spring JPA' 카테고리의 다른 글
[JPA] SQL View - JPA Entity 매핑 (0) | 2022.01.20 |
---|---|
[JPA] Fetch Join ( N+1 문제 해결) (0) | 2021.09.01 |
[JPA] 일대다 @OneToMany 연관관계 매핑(1:N) (0) | 2021.08.05 |
[JPA] 일대일 @OneToOne 연관관계 매핑(1:1) (0) | 2021.07.27 |
[JPA] 연관관계 매핑 관련 용어 정의 (0) | 2021.07.20 |