JPA @EmbeddedId를 이용한 복합키 매핑하기

반응형

아래와 같이 테이블의 키가  둘 이상의 컬럼으로 구성되어 있는 복합 키일 경우 매핑하는 방법에 대해 알아보자.

 

JPA에서는 복합 키를 지원하기 위해 @IdClass@EmbeddedId를 제공한다. 여기서는 @EmbeddedId를 이용해서 복합 키를 매핑하는 방법에 대해 알아보자.

 

 

아래 내용은 김영한님의 책 자바 ORM 표준 JPA 프로그래밍에서 나온 내용 중의 일부분이다.

 

JPA 복합 키를 사용하려면 별도의 식별자 클래스를 만들어야 한다.

@EmbeddedId 를 적용한 식별자 클래스는 다음 조건을 만족해야 한다.

  • @EmbeddedId 어노테이션을 붙여줘야 한다.
  • Serializable 인터페이스를 구현해야 한다.
  • 기본 생성자가 있어야 한다.
  • 식별자 클래스는 public 이어야 한다.

 

위 조건을 만족하는 @EmbeddedId 를 이용한 식별자 클래스 생성하자.

@Embeddable
@NoArgsConstructor
public class TaskId implements Serializable {
    @Column(name = "employee_id", length = 50)
    private String employeeId;

    @Column(name = "task_id", length = 11)
    private int taskId;

    public TaskId(String employeeId, int taskId) {
        this.employeeId = employeeId;
        this.taskId = taskId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TaskId taskId1 = (TaskId) o;
        return taskId == taskId1.taskId && Objects.equals(employeeId, taskId1.employeeId);
    }

    @Override
    public int hashCode() {
        return Objects.hash(employeeId, taskId);
    }
}

 

 

 

엔티티 클래스도 작성하자

@Setter
@Entity
@NoArgsConstructor
public class Task {
    @EmbeddedId
    private TaskId taskId;

    @Column(name = "task_name", length = 100)
    private String taskName;

    @Column(name = "date")
    @UpdateTimestamp
    private LocalDateTime updatedDate;

}

 

 

 

 

 

엔티티를 저장해보자

TaskId taskId = new TaskId("tgp-001", 1);

Task task = new Task();
task.setTaskId(taskId);
task.setTaskName("task 001");

entityManager.persist(task);

 

 

Id를 통해 엔티티 조회해볼 수 있다.

TaskId taskId = new TaskId("tgp-001", 1);
Task task = entityManager.find(Task.class, taskId);