-
JPA 복합키 엔티티JPA 2023. 2. 8. 00:01
개요
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를 활용하기 때문에 테스트 같은 경우에는 조금 다르게 작성해야 할 수 있습니다.
참고자료
'JPA' 카테고리의 다른 글
QueryDSL으로 동적쿼리 작성하기 (0) 2023.09.17 JPA Persistable으로 성능최적화 해보기 (0) 2023.09.04 QueryDSL StringTemplate이란? (0) 2023.02.03 QueryDSL이란? (0) 2023.02.01 QueryDSL fetchCount() deprecated 대안 (0) 2022.12.07