Spring

고급 매핑

codingtori 2025. 5. 5. 02:07

ORM에서의 상속관계 매핑 == 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계 매핑

 

구현방법

●  각각의 테이블로 변환 (= JPA 조인 전략)

    ○ @PrimaryKeyJoinColumn, @DiscriminatorColumn, @DiscriminatorValue

●  통합 테이블로 변환 (=  JPA 단일 테이블 전략)

    자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야함

    DiscriminatorColumn 필수

●  서브타입 테이블로 변환 (= JPA 구현 클래스마다 테이블 전략)

 

상속 매핑은 부모 클래스에 @Inheritance.매핑전략 사용


@MappedSupperclass
 : 실제 테이블과 매핑하지 않고 단순히 매핑 정보를 상속할 목적으로 사용

→ 부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속 받는 자식 클래스에게 매핑 정보만 제공할 때 사용

     → 직접 생성해서 사용할 일은 거의 없으므로 추상 클래스로 만드는 것이 권장됨

 

@AttributeOverrides, @AttributeOverride : 부모로부터 물려받은 매핑 정보를 재정의

@AssociationOverrides, @AssociationOverride : 부모로부터 물려받은 연관관계 재정의

 

 

외래 키가 기본 키에 포함되는 지 여부

식별 관계 : 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계

비식별 관계 : 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계

 

비식별 관계에서 외래 키에 NULL을 허용하는지 여부

●  필수적 비식별 관계(Mandatory) : 외래 키에 NULL 허용하지 않음. 연관관계를 필수적으로 맺어야 함

●  선택적 비식별 관계(Optional) : 외래 키에 NULL 허용. 연관관계 맺을지 말지 선택가능

→ 선택적 비식별 관계는 NULL을 허용하므로 조인 시에 외부 조인을 사용해야하기 때문에 필수적 비식별 관계가 더 좋음

 

→ 최근에는 비식별 관계를 주로 사용 + 꼭 필요한 곳에만 식별 관계 사용

 

 

식별자 필드가 2개 이상인 경우

별도의 식별자 클래스 만들고 그곳에 equals와 hasCode 구현 필요

 

●  IdClass

    [조건]

    ○ 식별자 클래스의 속성명과 엔티티에서 사용하는 식별자의 속성명이 같아야함

    ○ Serializable 인터페이스를 구현해야함

    ○ equals, hashCode를 구현해야함

    ○ 기본 생성자가 있어야 함

    ○ 식별자 클래스는 public 이어야 함

●  EmbeddedId

    [조건]

    ○ @Embeddable 어노테이션을 붙여주어야 함

    ○ Serializable 인터페이스를 구현해야함

    ○ equals, hashCode를 구현해야함

    ○ 기본 생성자가 있어야 함

    ○ 식별자 클래스는 public 이어야 함

 

@IdClass는, 

식별 관계의 경우, 기본 키와 외래 키를 같이 매핑해야함. 따라서 식별자 매핑인 @Id와 연관관계 매핑인 @ManyToOne을 같이 사용함


@EmbeddedId
는, 

식별 관계의 경우, 식별 관계로 사용할 연관관계의 속성에 @MapsId 사용


출처

https://product.kyobobook.co.kr/detail/S000000935744

 

자바 ORM 표준 JPA 프로그래밍 | 김영한 - 교보문고

자바 ORM 표준 JPA 프로그래밍 | 자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA

product.kyobobook.co.kr