Post

(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.