반응형
JPA 는 영속성 컨텍스트에 보관할 때 식별자를 키로 사용한다고 했다. 식별자 구분시에는 equals 와 hashCode 를 사용하므로 식별자 필드가 2 개 이상이면 별도의 식별자 클래스를 만들어서 equals 와 hashCode 를 구현해야 한다.
JPA 에는 복합 키 지원을 위해 @IdClass 와 @EmbeddedId 를 지원한다.
복합키를 사용하는 Characters클래스
복합키 사용시 @IdClass 를 이용하여 식별자 클래스로 맵핑하였다. 식별자 클래스의 특징을 다시한번 살펴보자면 Serializable 을 구현해야 하고, hashCode 와 equals 를 오버라이드 해야한다. 또한 식별자 클래스의 속성명과 엔티티의 속성명이 같아야 한다.
위의Collection 엔티티는 Character 엔티티를 외래키로 참조한다. 다중성은 Character : Collection= 1 : N 이므로 @ManyToOne 을 사용한다. 그리고 조인 컬럼이 2 개 이상이기 때문에 @JoinColumn 이 아닌 @JoinColumns 를 사용한다.
public static void save(EntityManager em) {
EntityTransaction tx = em.getTransaction();
tx.begin();
Characters characters = new Characters();
characters.setCharacId("character_id#1");
characters.setCharacStage("charac_stage#2");
em.persist(characters);
tx.commit();
em.close();
}
................
public static void find(EntityManager em) {
EntityTransaction tx = em.getTransaction();
tx.begin();
CharacterPK characterPK = new CharacterPK("character_id#1", "charac_stage#2");
Characters characters = em.find(characters.class, characterPKcharacterPK);
System.out.println("characters: " + characters);
tx.commit();
em.close();
}
복합키 엔티티를 저장할 때에는 식별자 클래스를 이용하여 저장하지 않아도 된다. 영속성 컨텍스트에 등록하기 전 내부에서 CharacterPK를 생성하여 키로 사용한다.
조회코드에서는 식별자 클래스인 CharacterPK 를 이용하여 조회한다. 이때 복합키를 생성자인자로 받는 생성자를 별도로 생성했는데, 필요 생성자를 별도로 구현시 기본생성자도 구현해주어야 한다.
반응형
'JPA' 카테고리의 다른 글
[JPA] Table 'mysql.hibernate_seq' doesn't exist 오류 해결 (0) | 2024.03.04 |
---|---|
@MappedSuperclass (0) | 2022.04.08 |
1:1매핑 (0) | 2022.03.17 |
양방향 매핑 (0) | 2022.03.16 |
[JPA] 매핑 어노테이션 정리 [column,Temporal, Enumerated, Lob, Transient] (0) | 2022.03.13 |