반응형
아래와 같이 테이블의 키가 둘 이상의 컬럼으로 구성되어 있는 복합 키일 경우 매핑하는 방법에 대해 알아보자.
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);
반응형