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

다대다: 연결 엔티티 사용(복합키)

@ManyToMany 사용 한계가 있다.

중간에 맵핑되는 테이블에 컬럼이 추가 되는 경우 이다.

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

  private String username;

  @ManyToMany(mappedBy = "member") //연관관계 주인은 누구?
  private List<Product> products = new ArrayList<>();

}

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

  private String name;

}

위 소스만 보면 연관관계 주인이 없다.

중간에 맵핑 되는 MEMBER_PRODUCT 테이블이 연관관계 주인이 된다.

@Entity
@IdClass(MemberProductId.class)
public class MemberProduct{
  @Id
  @ManyToMany
  @JoinColumn(name = "MEMBER_ID")
  private Member member; //MemberProductId.member 와 연결

  @Id
  @ManyToMany
  @JoinColumn(name = "PRODUCT_ID")
  private Product product;//MemberProductId.product 와 연결


  private int orderAmount;

}

//복합키를 위한 식별자 클래스
public class MemberProductId implements Serializable{
  private String member; //MemberProduct.member 연결
  private String product;//MemberProduct.product 와 연결

  @Override
  public boolean equals(Object o){...}

  @Override
  public boolean hashCode(){...}
}

식별자 클래스 특징

  • 복합 키는 별도의 식별자 클래스로 만들어야 한다.
  • Serializable을 구현해야 한다.
  • equals와 hashCode 메소드를 구현해야 한다.
  • 기본 생성자가 있어야 한다.
  • 클래스는 public이어야 한다.
  • @Idclass@EmbeddedId를 사용하는 방법도 있다.

저장

  Member member1 = mew Member();
  member1.setId("member1");
  member1.setUsername("회원1");

  em.persist(member1);

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

  em.persist(productA);

  MemberProduct memberProduct = new MemberProduct();
  memberProduct.setMember(member1);
  memberProduct.setProduct(productA);
  memberProduct.setOrderAmount(2);


  em.persist(memberProduct);

조회

MemberProductId memberProductId = new MemberProductId();
memberProductId.setMember("member1");
memberProductId.setProduct("productA");


MemberProduct memberProduct = em.find(MemberProduct.class, memberProductId);

memberProduct.getMember();
memberProduct.getProduct();
⚠️ **GitHub.com Fallback** ⚠️