[JPA] 복합키와 식별관계 Mapping

Jiwoo Kim·2020년 11월 17일
0

JPA 마스터하기

목록 보기
8/14
post-thumbnail

💡 데이터베이스 설계의 관점, 그리고 객체 관계 매핑의 관점 모두 필수적 비식별 관계를 선호한다.

비식별 관계

  • 필수적 비식별 관계 (Mandatory) : 연관관계를 필수적으로 맺어 FK에 NULL을 허용하지 않는다.
  • 선택적 비식별 관계 (Optional) : 연관관계를 선택적으로 맺어 FK에 NULL을 허용한다.

@IdClass

  • 별도의 식별자 클래스를 생성한다.
  • 엔티티 클래스에 PK1, PK2를 모두 필드로 가진다.

필수 조건

  • 식별자 클래스의 속성명과 엔티티에서 사용하는 식별자의 속성명이 같아야 한다.
  • Serializable interface를 구현해야 한다.
  • equals, hashCode를 구현해야 한다.
  • 기본 생성자가 있어야 한다.
  • 식별자 클래스는 public이어야 한다.
  • 식별자 클래스를 사용하는 클래스에 @IdClass(식별자.class) annotation을 붙여야 한다.

@EmbeddedId

  • 별도의 식별자 클래스를 생성한다.
  • 엔티티 클래스에 식별자 클래스 객체를 필드로 가진다.

필수 조건

  • 식별자 클래스에 @Embeddable annotation을 붙여야 한다.
  • Serializable interface를 구현해야 한다.
  • equals, hashCode를 구현해야 한다.
  • 기본 생성자가 있어야 한다.
  • 식별자 클래스는 public이어야 한다.

식별 관계

상위 테이블의 PK를 받아 하위 테이블의 PK + FK로 사용하는 관계

@IdClass

  • 별도의 식별자 클래스를 생성한다.
  • 식별자 매핑인 @Id와 연관관계 매핑인 @ManyToOne을 같이 사용한다.

@EmbeddedId, @MapsId

  • 별도의 @Embeddable 식별자 클래스를 생성한다.
  • 식별자 매핑인 @EmbeddedId와 연관관계 매핑인 @MapsId을 같이 사용한다.
  • @MapsId의 속성 값은 PK의 필드명이다.

1:1 식별 관계

상위 테이블의 PK를 받아 하위 테이블의 단일 PK + FK로 사용하는 관계

@MapsId

  • 복합키가 아니면 식별자 클래스를 생성할 필요가 없다.
  • 식별자 매핑인 @Id와 연관관계 매핑인 @MapsId을 같이 사용한다.
  • PK가 복합키가 아니면 @MapsId의 속성 값은 비워 둔다.

본 포스팅은 자바 ORM 표준 JPA 프로그래밍 (김영한 저)을 읽고 정리한 내용입니다. (2020.09.13)

0개의 댓글