다양한 연관관계 매핑(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();