현의 개발 블로그

[다양한 연관관계 매핑] 다대다 본문

스프링부트 이론/JPA

[다양한 연관관계 매핑] 다대다

hyun2371 2023. 5. 23. 19:50

앞에서 일대일 연관관계를 살펴보았다.

 

다양한 연관관계 매핑(3) - 일대일

앞에서 일대다 연관관계를 살펴보았다. 다양한 연관관계 매핑(2) - 일대다 앞에서 다대일 연관관계를 살펴보았다. 다양한 연관관계 매핑(1) - 다대일 연관관계 매핑 시 고려사항 3가지 1. 다중성

hyun-keepdeving.tistory.com

이번 글에서는 다대다 연관관계를 알아볼 것이다.

 

다대다

관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.

중간에 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 한다.

 

 

이와 달리, 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계가 가능하다.

Member도 productList를 가질 수 있고, Product도 memberList를 가질 수 있다.

 

 

 

 

다대다 연관관계 매핑

@ManyToMany를 사용하며, @JoinTable 로 연결 테이블을 지정한다.

다대다 매핑은 단방향, 양방향 모두 가능하다.

 

단방향

Member에 @JoinTable로 연결 테이블 MEMBER_PRODUCT를  명시하였다.

//Member.java
@ManyToMany
@JoinTable(name = "MEMBER_PRODUCT")
private List<Product> products = new ArrayList<>();

아래와 같은 ddl문이 생성된다.

 

 

양방향

//Member.java
@ManyToMany
@JoinTable(name = "MEMBER_PRODUCT")
private List<Product> products = new ArrayList<>();

//Product.java
@ManyToMany(mappedBy = "products")
private List<Member> members = new ArrayList<>();

 

 

다대다 연관관계 한계

연결 테이블은 단순히 연결만 하고 끝나지 않는다.

실무에서는 주문 시간, 수량 같은 데이터가 들어올 수 있다.

하지만, 다대다 연관관계는 중간 테이블에 매핑 정보만 들어가고, 추가 컬럼이 들어갈 수 없다.

 

다대다 연관관계 한계 극복

연결 테이블을 엔티티로 승격한다.

다대다 관계를 다대일, 일대다 관계로 풀어낸다.

//MemberProduct.java 엔티티명을 Orders로 변경할 수도 있음

@Id @GeneratedValue
private Long id;

@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;

@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;


//Member.java
@OneToMany(mappedBy = "member")
private MemberProduct memberProducts = new ArrayList<>():

//Product.java
@OneToMany(mappedBy = "product")
private List <MemberProduct> memberProducts = new ArrayList<>();

 

 


Reference

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자

www.inflearn.com

 

Comments