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

학습 페이지

배송과 카테고리 엔티티가 추가된 객체 설

Untitled

주문과 배송이 일대일, 상품과 카테고리가 다대다인 관계를 전에 배운것으로 풀어보자.

ERD

Untitled

엔티티 상세

Untitled

아무튼 실습해보자. 먼저 카테고리 클래스와 딜리버리 클래스를 만든다.

package hellojpa;

import jakarta.persistence.*;

@Entity
public class Category {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Category parent;
    
    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();
    
}

package hellojpa;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;

@Entity
public class Delivery {

    @Id @GeneratedValue
    private Long id;

    private String city;
    private String street;
    private String zipcode;
    private DeliveryStatus status;
}

💡 핵심적인건 아니지만, 재미있는 기술이 하나 나온다. Category클래스를 보면 스스로와 매핑되어있는 걸 볼 수 있다.

 @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Category parent;
    
    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();

이건… 잘 이해는 안되는데, 왜냐면 DB에 PARENT_ID가 어느 테이블에 있는지..?

객체

Untitled

DB

Untitled

보면… CATEGORY테이블에 PARENT_ID가 있다. 근데 FK이다. DB ERD어디를 봐도 PARENT_ID를 PK로 가진 테이블이 없다. 그니까 이건 그냥 스스로 PK이자 FK로 가지고 있는건가…? 카테고리 테이블엔 말 그대로 종류가 종류별로 있을 것임. 동일 테이블의 다른 레코드의 CATEGORY_ID를 가져와 본인이 FK로 쓰는 듯 하다…!!!