복합키 객체 생성
- 공통 : 엔티티 클래스의 PK 만을 속성으로 갖는 별도의 Composite Key 클래스가 있어야 한다.
- @EmbeddedId 방식 : Composite Key 클래스를 정의하고 entity 클래스 내부에 직접 사용
@Entity
data class TChild(
@EmbeddedId
var tChildIdL TChildId
) {
val parentId
get() = tChildIdL.parentId
@MapsId("parentId")
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "parentId")
lateinit var tParent: TParent
}
@Embeddable
data class TChildId(
var parentId: Long = 0,
var childId: Long = 0
) : Serializable
- @IdClass 방식 : Composite Key 클래스를 정의하고 entity 클래스 내부에는 PK 컬럼을 직접 사용하고 @id 로 매핑만 해줌
@Entity
@IdClass(TChildId::class)
data class TChild(
@Id
var parentId: Long,
@Id
var childId: Long
) {
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "parentId", referencedColumnName = "parentId", insertable = false, updatable = false)
lateinit var tParent: TParent
}
data class TChildId(
var parentId: Long = 0,
var childId: Long = 0
) : Serializable
관계 맺기
@EmbeddedId 방식
- Composite Key 클래스를 직접 속성으로 사용하므로, 매핑관계를 이용하여 다른 엔티티를 입력/수정/삭제 할 수 있고 영속성 전이 등의 기능을 사용할 수 있다.
- @MapsId 를 이용하여 실제 key 의 속성을 알려주어야 한다.
- 실제 테이블 구조와 엔티티 구조가 달라 직관적이지 않고, 엔티티 생성자에 항상 Composite Key 객체를 넣어주어야 하는 번거로움이 있다.
- 복합키 안의 컬럼을 직접 사용하기 위해서는 별도의 get메소드가 필요하다. 위 예시에서는 getParentId() 메소드를 만들어서 embedded 된 id 클래스의 속성을 가져오도록 함
@IdClass 방식
- 엔티티 클래스의 속성으로 개별 key 를 가질수 있어서 직관적이고 단순함
- 다만, 속성값이 중복되므로 매핑된 다른 엔티티 객체는 insertable = false, updatable = false 으로 설정해야 한다. 따라서 매핑된 다른 엔티티를 직접 입력/수정/삭제는 할 수 없다.
[참고링크]
woowabros.github.io/experience/2019/01/04/composit-key-jpa.html
'SW 공부' 카테고리의 다른 글
[Kotlin] 코루틴 기초 (0) | 2021.03.19 |
---|---|
[Ssh] ssh 키를 이용하여 로그인하기 (0) | 2020.11.01 |
[Redis] redis 를 이용한 global session 관리 (0) | 2020.10.15 |
[Spring] service 테스트 작성 요령 (0) | 2020.07.06 |
[JPA] OneToOne 테이블 설계와 JPA 매핑 (0) | 2020.01.07 |