JPA에서는 DB 테이블 간 관계를 매핑하기 위한 어노테이션들을 지원한다
이 페이지에서는 N:M 관계를 매핑하는 @ManyToMany 어노테이션에 대해 알아보겠다
Entity
Entity 상에서 아래와 같이 N:M 관계를 표현할 수 있다
DB
실제 테이블 에서는 N:M 관계를 표현할 수 없다
N:M관계를 표현하기 위해 중간에 연결 테이블을 두어 1:N과 N:1관계로 풀어서 표현한다
아래 그림에서 N:M관계인 Order와 Item의 관계를
연결 테이블인 OrderItem 테이블을 두어 1:N, N:1 관계로 풀어서 표현하는 것을 볼 수 있다
양방향 연관관계 적용
1. N:M 관계에서 M의 관계인 Item에 Orders 참조변수 추가
2. ManyToMany 관계 설정 및 mappedBy 속성 추가
@ManyToMany 관계를 사용하면 안 되는 이유
연결 테이블이 연결만 하고 끝나지 않음
@ManyToMany 관계를 설정할 경우
JPA에서 아래 그림처럼 연결 테이블 ORDER_ITEM을 생성해준다
ORDER_ITEM에 ORDER와 ITEM 테이블을 연결하기 위한 키 값인 ORDER_ID, ITEM_ID 외에도
NUM_OF_ITEM(총 구매수량), TOTAL_PRICE(총 구매액)이 추가될 수도 있다
또한, 데이터를 CRUD할 때 쿼리가 복잡해 지는 문제가 있다
위 문제로 인해 실무에서는 잘 쓰이지 않기도 하고 사용을 권장하지 않는다
@ManyToMany 를 @ManyToOne과 @OneToMany로 표현해야 한다
ORDER_ITEM 테이블에 ORDER와 ITEM 테이블을 연결하기 위한 키 값인 ORDER_ID, ITEM_ID 외에도
NUM_OF_ITEM(총 구매수량), TOTAL_PRICE(총 구매액)이 추가될 수도 있기 때문에
아래와 같이 OrderItem Entity를 별도로 작성하고
Order와 Item 엔티티를 각각 @ManyToOne과 @OneToMany로 표현한다
'Spring > JPA' 카테고리의 다른 글
@MappedSuperclass (0) | 2023.03.24 |
---|---|
상속관계 매핑 (0) | 2023.03.24 |
연관관계 - @OneToOne (0) | 2023.03.22 |
연관관계 - @OneToMany (0) | 2023.03.18 |
연관관계 - @ManyToOne (0) | 2023.03.17 |
댓글