wms's Programming&Study

JPA 엔티티 복합키 설정하기 본문

Programming/JAVA

JPA 엔티티 복합키 설정하기

wms2275 2023. 1. 8. 23:06

이슈사항

배치로 통계를 구축해야하는데 mybatis 같은 경우에는 DB에서 pk를 여러개 만들어주면 되지만
JPA에서는 엔티티에서도 id를 지정해줘야하기 때문에
엔티티에 복합키를 설정하는 방법을 찾아보았다.

 

해결방안

엔티티에 복합키를 설정하는 방법으로 2가지를 찾았다.
1. @Embeddable
2. @IdClass

그리고 각각 조건이 있는데 아래 사항을 만족해야한다.

@Embeddable
- 식별자 클래스에 @Embeddable어노테이션 추가
- 디폴트 생성자가 존재 (위의 코드는 Lombok의 @NoArgsConstructor어노테이션 추가로 자동 생성)
- 식별자 클래스의 접근 지정자는 public
- Serializable을 상속
- 컬럼명과 변수명이 다를 경우 @Column어노테이션 사용

@IdClass
- 식별자 클래스의 변수명과 엔티티에서 사용되는 변수명이 동일
- 디폴트 생성자가 존재 (위의 코드는 Lombok의 @NoArgsConstructor어노테이션 추가로 자동 생성)
- 식별자 클래스의 접근 지정자는 public
- Serializable을 상속

 

해결

@Embeddable 같은 경우에는 나중에 엔티티에서 통계를 꺼내 올 때
ID를 지정해둔 클래스에 한번 더 접근해서 가져와야하기 때문에 코드가 좀 더 길어지게 된다.
그래서 좀 더 보기 쉬운 @IdClass 로 선택하였다.

엔티티 부분 코드

@Entity
@Table(name = "statistics")
@IdClass(StatisticsId.class)
public class Statistics {
	@Id
    @Column(name = "statistics_date")
    private LocalDate statisticsDate;
    
    @Id
    @Column(name = "statistics_id")
    private Long statisticsId;
    
    @Column(name = "statistics_type", nullable = false)
    @Enumerated(EnumType.STRING)
    private String statisticsType;
}

 

복합키 클래스 코드

public class StatisticsId implements Serializable {

  @Column(name = "statistics_date")
  private LocalDate statisticsDate;

  @Column(name = "statistics_id")
  private Long statisticsId;
}

 

Repository 부분 코드

JpaRepository의 제네릭 타입에는 엔티티 클래스와 엔티티 클래스의 기본키 클래스를 넣어주면 된다.

public interface StatisticsRepository extends JpaRepository<Statistics, StatisticsId> {
}

 

 

참고 사이트

https://jforj.tistory.com/84