twocowsong

다 대 다 : 양방향 본문

IT/JPA

다 대 다 : 양방향

WsCode 2022. 6. 26. 13:22

다대다 매핑이므로 역방향도 @ManyToMany를 사용합니다.

그리고 양쪽 중 원하는곳에 mappedBy로 연관관계의 주인을 지정합니다.

(mappedBy가 없는곳이 연관관계의 주인이 됩니다.)

@Entity
public class Product {
   @Id
   private String id;

   private String name;

   @ManyToMany(mappedBy = "products")
   private List<Member> members;

}

다대다의 양방향 연관관계는 다음처럼 설정하면 됩니다.

member.getProducts().add(product);
product.getMembers().add(member);

 

위같은 상황에는 양방향 연관관계는 연관관계 편의 메소드를 추가해서 관리하는것이 편리합니다.

(그렇지 않으면 중간에 꼬이는 상황이 발생하게됩니다.)

다음처럼 회원 엔티티에 연관관계 편의 메소드를 추가해줍시다.

// 연관관계 편의 메소드
public void addProduct(Product product) {
   // ...
   products.add(product);
   product.getMembers().add(this);
}

연관관계 편의 메소드를 추가했으므로 다음처럼 간단히 양방향 연관관계를 설정하면 됩니다.

member.addProduct(product);

양방향 연관관계로 만들었으므로 product.getMembers() 를 사용해서 역방향으로 객체 그래프를 탐색 할 수 있습니다.

 

public static void find(EntityManager em) {
   Product product = em.find(Product.class, "productA");
   List<Member> members = product.getMembers();
   for (Member member : members) {
      System.out.println("members : " + member.getUsername());
   }
}

연관관계의 설정만으로도 Product엔티티를 조회해서 product의 id가 ProductA에 해당하는 Member엔티티정보를 모두 조회할수 있습니다.

'IT > JPA' 카테고리의 다른 글

다대다 : 새로운 기본 키 사용  (0) 2022.06.27
다 대 다 : 매핑의 한계와 극복, 연결 엔티티 사용  (0) 2022.06.26
다 대 다 : 단방향  (0) 2022.06.21
다 대 다 [N : N]  (0) 2022.06.20
대상 테이블에 외래 키  (0) 2022.06.19