실전 예제 3 - 다양한 연관관계 매핑
Last updated
Last updated
배송, 카테고리 추가 - 엔티티
주문: 배송 = 1:1 상품:카테고리 = N:M (@ManyToMany) 여러개의 상품이 한 카테고리에 속할 수 있고, 한 상품은 여러개의 카테고리에 속할 수 있다. 다대다 관계는 다대일, 일대다로 풀어내는 것이 좋지만 예시를 위해 다대다로 구현해본다.
주문-배송(1:1) 관계에서 주문을 주 테이블로 잡는다. 주문을 통해 배송을 조회하기 때문이다.
양방향 관계 매핑할 때 헷갈리는 점
주테이블 또는 주인 : @JoinColumn(name = " NAME ") NAME 은 참조하는 엔티티의 ID(상대 엔티티의 @Column의 name이다! 그러므로 A에서 B를 참조할 경우, B의 ID 이름@Column(name = "...")을 넣어주면 된다!
대상 테이블 또는 주인반대편 : @XtoY(mappedBy = " NAME ") 매핑대상이 되는 엔티티는 mappedBy를 붙여주고 주인 엔티티(주테이블)에서의 해당 엔티티 필드 변수명을 넣어주면 된다!!!
다대다 관계
한쪽을 주인으로 정하고, 주인 객체에서 중간 테이블을 생성한다.(@JoinTable)
현재 객체의 매핑할 필드(칼럼)와 상대 객체의 매핑할 필드(칼럼)을 매핑한다! @joinColumns = @JoinColumn(name = "현재 객체 매핑 필드"), @inverseJoinColumns = @JoinColumn(name="상대 객체 매핑 필드")
주인 반대편의 상대 객체는 @ManyToMany(mappedBy = "filed_name")으로 해준다!
정리
N:M 관계는 1:N, N:1로(실전에서 @ManyToMany 사용❌)
중간에 엔티티를 하나 생성해서 1:N, N:1로 만든다!
실전에서는 중간 테이블이 단순하지 않다!!
제약 : 중간테이블에 필드 추가 불가, 엔티티 테이블 불일치
@ManyToOne 주요 속성 특징 : mappedBy가 없다 => @ManyToOne은 주인이 되야한다.
@JoinColumn : (주인 또는 주테이블이)외래 키를 매핑할 때 사용⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️
@OneToMany 주요 속성
속성
설명
기본값
optional
false로 설정하면 연관된 엔티티가 항상 있어야 함.
TRUE
fetch⭐️
글로벌 fetch 전략 설정
@ManyToOne : FetchType.EAGER
@OneToMany : FetchType.LAZY
cascade⭐️
영속성 전이 기능 사용
targetEntity
연관된 엔티티의 타입 정보를 설정
컬렉션을 사용해도 제네릭으로 타입 정보 알 수 있기 때문에 거의 사용❌
속성
설명
기본값
mappedBy
연관관계의 주인 필드를 선택한다!!!
fetch⭐️
글로벌 fetch 전략 설정
@ManyToOne : FetchType.EAGER
@OneToMany : FetchType.LAZY
cascade⭐️
영속성 전이 기능 사용
targetEntity
연관된 엔티티의 타입 정보를 설정
컬렉션을 사용해도 제네릭으로 타입 정보 알 수 있기 때문에 거의 사용❌