간혹 여러개의 칼럼을 조합해 기본키로 써야 하는 경우가 있다.
이러한 키를 복합키라고 하는데 JPA에서는 객체지향적으로 복합 키를 지정할 수 있다.
@Embeddable 애노테이션은 클래스에 붙힌다.
이 애노테이션이 붙은 클래스는
다른 엔티티 클래스에 내장되어 복합 키가 된다.
@EmbeddedId 애노테이션은 필드에 붙힌다.
위에서 말한 @Embeddable 이 붙은 클래스를 복합키로
갖는 엔티티 클래스에서 복합키 필드에 붙힌다.
모든 사람의 이름이 전부 다르다는 가정 하에
Member이라는 테이블이 있다고 생각해보자.
Member의 성과 이름으로 복합키를 지정하고 싶다고 해보자.
@Embeddable
public class MemberId implements Serializable {
private String firstName;
private String lastName;
// standard getters and setters
}
먼저 복합키에 해당하는 클래스를 만든다.
@Entity
public class Member {
@EmbeddedId
private MemberId;
private Integer age;
private String phone;
private String city;
//standard getters and setters
}
그리고 고객 엔티티 클래스에서 이 클래스를 복합키로 사용한다.
@Repository
public interface MemberRepository extends JpaRepository<Member, MemberId> {
List<Member> findByIdFirstName(String firstName);
List<Member> findByIdLastName(String lastName);
}
JpaRepository 에서 복합키로 Member을 검색하고 싶다면 이렇게 메서드 이름을 지어주면 된다.
나는 파일 업로드를 구현하다가 UUID 와 파일 이름으로 복합 키를 생성해야 하는 문제를 맞닥뜨려 알아보게 되었다.