JPA

JPA - 복합키와 식별 관계 맵핑

jojelly 2023. 5. 29. 22:12
반응형

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