💡 데이터베이스 설계의 관점, 그리고 객체 관계 매핑의 관점 모두 필수적 비식별 관계를 선호한다.
비식별 관계
- 필수적 비식별 관계 (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의 속성 값은 비워 둔다.