티스토리 뷰

[개발] - Spring/JPA 공부

다대다 [N : N]

완벽한 장면 2023. 8. 21. 08:35

다대다

 

 

 

실습

새로 생성

Product

@Entity
@NoArgsConstructor
public class Product {

  @Id
  @GeneratedValue
  private Long id;

  private String name;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

 

Member 에다가

  @ManyToMany
  @JoinTable(name = "MEMBER_PRODUCT")// 테이블명 적어줘야
  private List<Product> products = new ArrayList<>();

 

 

실행하면

Hibernate: 
    
    create table MEMBER_PRODUCT (
       Member_MEMBER_ID bigint not null,
        products_id bigint not null
    )

Hibernate: 
    
    create table Product (
       id bigint not null,
        name varchar(255),
        primary key (id)
    )

Hibernate: 
    
    alter table MEMBER_PRODUCT 
       add constraint FKc6hsxwm11n18ahnh5yvbj62cf 
       foreign key (products_id) 
       references Product
15:40:29.879 [main] DEBUG org.hibernate.SQL - 
    
Hibernate: 
    
    alter table MEMBER_PRODUCT 
       add constraint FK4ibylolqmostllrjdc147aowv 
       foreign key (Member_MEMBER_ID) 
       references Member
15:40:29.882 [main] DEBUG org.hibernate.SQL - 
    
중략 및 후략

 

양방향으로 만들고 싶으면

Product 가서

  // 양방향으로 만들고 싶으면
  @ManyToMany(mappedBy = "products")
  private List<Member> members = new ArrayList<>();

이거 추가하면 됨.

 

 

다대다 매핑의 한계

 


다대다 한계 극복

실습

MemberProduct 생성

@Entity
@NoArgsConstructor
@Table(name = "ORDERS")
public class MemberProduct {

  @Id
  @GeneratedValue
  private Long id;

  private String name;

  private int count;
  private int price;
  private LocalDateTime orderDateTime;

}

 

 

Product 에 이렇게 수정해주고

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

Member도 수정

  @OneToMany(mappedBy = "member")
  private List<MemberProduct> memberProducts = new ArrayList<>();

 

그리고 MemberProduct 도 적절히 연결하면 됨

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

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

이거 추가하면

MemberProduct 풀버전은

@Entity
@NoArgsConstructor
@Table(name = "ORDERS")
public class MemberProduct {

  @Id
  @GeneratedValue
  private Long id;

  private String name;

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

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

  private int count;
  private int price;
  private LocalDateTime orderDateTime;

}

 


한계 극복 방법은 2개 있다.

1. 연결 테이블에 PK를 묶어서 처리

두 개 묶어서 PK로 잡는데, 그러면서 각각을 동시에 FK로 묶는 방식

 

2. PK는 따로 하나 만들어서 잡아두고, 각각은 FK로만 사용하는 방식

 

이 방식을 더 추천, 이러면 나중에 유연성이 더 커진다.

728x90
반응형

'[개발] - Spring > JPA 공부' 카테고리의 다른 글

상속관계 매핑  (0) 2023.08.23
실습 3 - 다양한 연관관계 매핑  (1) 2023.08.22
일대일 [1 : 1]  (0) 2023.08.21
일대다 [1 : N]  (0) 2023.08.20
다대일 [N : 1]  (0) 2023.08.20
Comments
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
250x250