다양한 연관관계 매핑(3) - slahsk/study GitHub Wiki

다대다[N:N]

중간에 연결 테이블을 추개해야 한다.

다대다: 단방향

  @Entity
  public class Member{
    @Id
    @Column(name = "MEBMER_ID")
    private String id;

    private String username;

    @ManyToMany
    @JoinTable(name = "MEMBER_PRODUCT",
               joinColumns = @JoinColumn(name = "MEMBER_ID"),
               inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID")
               )
    private List<Product> products = new ArrayList<>();

  }

  @Entity
  public class Product{
    @Id
    @Column(name = "PRODUCT_ID")
    private String id;

    private String name;
  }

저장

  Product productA = new Product();
  productA.setId("productA");
  productA.setName("상품A");

  em.persist(productA);

  Member member1 = new Member();
  member1.setId("member1");
  member1.setUsername("회원1");
  member1.getProduct().add(productA);

  em.persist(member1);

PRODUCT 테이블 저장

MEMBER 테이블 저장

연관관계 때문에 MEMBER_PRODUCT 테이블도 저장한다.

탐색

  Member member = em.find(Member.class, "member1");
  List<Product> products = member.getProducts();

  for(Product product : products){
    System.out.println("product.name =" + product.getName());
  }

member.getProducts() 를 호출해서 상품 이름을 출력하면 product 정보를 조회하는 쿼리가 실행 된다.

다대다: 양방향

@Entity
public class Product{
  @Id
  @Column(name = "PRODUCT_ID")
  private String id;

  private String name;

  @ManyToMany(mappedBy = "products") //역방향
  private List<Member> members;
}

Member 는 같고 Product@ManyToMany 추가 한다.

mappedBy 없는곳이 연관관계 주인이다.(외래 키를 가지고 있다.)

⚠️ **GitHub.com Fallback** ⚠️