실전 예제 3 - 다양한 연관관계 매핑

배송, 카테고리 추가 - 엔티티

주문: 배송 = 1:1 상품:카테고리 = N:M (@ManyToMany) 여러개의 상품이 한 카테고리에 속할 수 있고, 한 상품은 여러개의 카테고리에 속할 수 있다. 다대다 관계는 다대일, 일대다로 풀어내는 것이 좋지만 예시를 위해 다대다로 구현해본다.

ERD

주문-배송(1:1) 관계에서 주문을 주 테이블로 잡는다. 주문을 통해 배송을 조회하기 때문이다.

엔티티 상세 설계 & 매핑

양방향 관계 매핑할 때 헷갈리는 점

주테이블 또는 주인 : @JoinColumn(name = " NAME ") NAME 은 참조하는 엔티티의 ID(상대 엔티티의 @Column의 name이다! 그러므로 A에서 B를 참조할 경우, B의 ID 이름@Column(name = "...")을 넣어주면 된다!

대상 테이블 또는 주인반대편 : @XtoY(mappedBy = " NAME ") 매핑대상이 되는 엔티티는 mappedBy를 붙여주고 주인 엔티티(주테이블)에서의 해당 엔티티 필드 변수명을 넣어주면 된다!!!

다대다 관계

  1. 한쪽을 주인으로 정하고, 주인 객체에서 중간 테이블을 생성한다.(@JoinTable)

  2. 현재 객체의 매핑할 필드(칼럼)와 상대 객체의 매핑할 필드(칼럼)을 매핑한다! @joinColumns = @JoinColumn(name = "현재 객체 매핑 필드"), @inverseJoinColumns = @JoinColumn(name="상대 객체 매핑 필드")

  3. 주인 반대편의 상대 객체는 @ManyToMany(mappedBy = "filed_name")으로 해준다!

정리

N:M 관계는 1:N, N:1로(실전에서 @ManyToMany 사용❌)

  • 중간에 엔티티를 하나 생성해서 1:N, N:1로 만든다!

  • 실전에서는 중간 테이블이 단순하지 않다!!

  • 제약 : 중간테이블에 필드 추가 불가, 엔티티 테이블 불일치

@ManyToOne 주요 속성 특징 : mappedBy가 없다 => @ManyToOne은 주인이 되야한다.

속성

설명

기본값

optional

false로 설정하면 연관된 엔티티가 항상 있어야 함.

TRUE

fetch⭐️

글로벌 fetch 전략 설정

@ManyToOne : FetchType.EAGER

@OneToMany : FetchType.LAZY

cascade⭐️

영속성 전이 기능 사용

targetEntity

연관된 엔티티의 타입 정보를 설정

컬렉션을 사용해도 제네릭으로 타입 정보 알 수 있기 때문에 거의 사용❌

@JoinColumn : (주인 또는 주테이블이)외래 키를 매핑할 때 사용⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️

@OneToMany 주요 속성

속성

설명

기본값

mappedBy

연관관계의 주인 필드를 선택한다!!!

fetch⭐️

글로벌 fetch 전략 설정

@ManyToOne : FetchType.EAGER

@OneToMany : FetchType.LAZY

cascade⭐️

영속성 전이 기능 사용

targetEntity

연관된 엔티티의 타입 정보를 설정

컬렉션을 사용해도 제네릭으로 타입 정보 알 수 있기 때문에 거의 사용❌

Last updated

Was this helpful?