JPA

JPA 복합키 엔티티

Junuuu 2023. 2. 8. 00:01
728x90

개요

JPA에서 단일 PK가 아닌 2개 이상의 PK를 가질 경우 어떻게 구성하는지 알아보고자 합니다.

 


MySQL 테이블 데이터 

create table my_table
(
  a varchar(50) not null,
  b varchar(20) not null,
  c varchar(50),
  constraint pk_my_table
    primary key (a, b)
);

 

테이블 복합키를 담고 있는 식별자 클래스 생성

data class MyTableId(
  val a: String,
  val b: String,
) : Serializable{
  constructor() : this("", "")
}

@IdClass를 사용하기 위한 식별자 클래스를 생성할 때는 다음과 같은 조건을 만족해야 합니다.

- 식별자 클래스의 변수명과 엔티티에서 사용되는 변수명이 동일

- 디폴트 생성자가 존재(코틀린의 부 생성자 활용)

- 식별자 클래스의 접근 지적자는 public

- Serializable을 상속

- equals, hashCode 구현(data class 활용)

 

엔티티 클래스 생성

@Entity
@Table(name = "my_table")
@IdClass(MyTableId::class)
class TiaVas(
  @Column(name = "c", length = 50)
  val c: String,
){
  @Id
  @Column(name = "a", nullable = false, length = 50)
  val a: String? = null

  @Id
  @Column(name = "b", nullable = false, length = 20)
  val b: String? = null
}

 

엔티티 클래스에 @IdClass라는 어노테이션을 이용해 식별자 클래스를 매핑합니다.

이때, 식별자 클래스의 변수명과 엔티티 클래스의 @Id값들이 동일해야 합니다.

 

Repository생성

interface TiaVasRepository : JpaRepository<TiaVas, TiaVasId>, CustomTsnRepository {
}

 

테스트

@SpringBootTest
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@ActiveProfiles("local")
class TiaVasRepoTest @Autowired constructor(
  private val tiaVasRepository: TiaVasRepository,
){

  @Test
  fun `tia_vas 테이블이 정상적으로 생성되고 데이터가 불러와지는지 테스트`(){
    val result = tiaVasRepository.findAll()
    result.size shouldBe 10
  }
}

이미 테스트 데이터를 10건 채워놓은 환경이며 kotest를 활용하기 때문에 테스트 같은 경우에는 조금 다르게 작성해야 할 수 있습니다.

 

 

참고자료

https://jforj.tistory.com/84

 

[JPA] 복합키(Composite Key) 엔티티

안녕하세요. J4J입니다. 이번 포스팅은 JPA 복합키(Composite Key) 엔티티에 대해 적어보는 시간을 가져보려고 합니다. 들어가기에 앞서 이전에 작성된 포스팅을 읽고 오시면 이해가 더 잘되실 겁니다

jforj.tistory.com