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를 활용하기 때문에 테스트 같은 경우에는 조금 다르게 작성해야 할 수 있습니다.
참고자료