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

반응형