(JPA)다대다 매핑
연관관계 매핑(다대다)
- 관계형 데이터베이스는 정규화된 테이블 2개로
다대다
관계를 표현할 수 없다. - 연결 테이블을 추가해서
일대다
,다대일
관계로 풀어내야한다. - 객체는 컬렉션을 사용해서 객체 2개로
다대다
관계가 가능하다.
다대다 객체 연관관계(단방향)
Product
1
2
3
4
5
6
7
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
}
Member
1
2
3
4
5
6
7
8
9
10
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@ManyToMany
@JoinTable(name = "member_product")
private List<Product> products = new ArrayList<>();
}
다대다 객체 연관관계(양방향)
Product
1
2
3
4
5
6
7
8
9
10
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToMany(mappedBy = "products")
private List<Member> members = new ArrayList<>();
}
Member
1
2
3
4
5
6
7
8
9
10
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@ManyToMany
@JoinTable(name = "member_product")
private List<Product> products = new ArrayList<>();
}
다대다 매핑의 한계
- 편리해 보이지만 실무에서 사용하지 못한다.
- 연결테이블이 단순하게 연결만 하고 끝나지 않는다.
- 연결테이블에 매핑 정보 외에 다른 정보를 넣을 수 없다.
다대다 한계 극복
- 연결 테이블용
엔티티
추가 @ManyToMany
를@OneToMany
와@ManyToOne
으로 분리하여 사용
MemberProduct
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
public class MemberProduct {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@ManyToOne
@JoinColumn(name = "product_id")
private Product product;
}
Member
1
2
3
4
5
6
7
8
9
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "member")
private List<MemberProduct> memberProducts = new ArrayList<>();
}
Product
1
2
3
4
5
6
7
8
9
10
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "product")
private List<MemberProduct> memberProducts = new ArrayList<>();
}
REFERENCE
#JPA_다대다 #연관관계_매핑
This post is licensed under CC BY 4.0 by the author.