관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 그래서 보통 다대다 관계를 일대다, 다대일 관계로 풀어내는 연결 테이블을 사용한다.
다대다 단방향 관계
- 회원 entity 와 상품 entity 를
@ManyToMany로 매핑했다.
위의 코드는@ManyToMany와@JoinTable을 사용해서 연결 테이블을 바로 매핑한 것.@ManyToMany사용시 연결 테이블을 자동으로 처리해주므로 모델이 단순해지고 여러가지로 편리하다.- 회원과 상품을 연결하는 회원_상품(Member_Product) 엔터티 없이 매핑을 완료할 수 있다.
+ @JoinTalbe 의 속성 1. @JoinTable.name : 연결 테이블을 지정. 2. @JoinTable.joinColumns : 현재 방향인 회원과 매핑할 조인 칼럼 정보를 지정. 3. @JoinTable.inverseJoinColumns : 반대 방향인 상품과 매핑할 조인 컬럼 정보 를 지정
회원 상품 엔티티 기본 키가 MEMBER_ID 와 PRODUCT_ID 로 이루어진 복합 기본 키다. JPA 에서 복합키 사용시, 별도의 식별자 클래스를 생성해야한다. 그리고 엔터티에
@IdClass를 사용해서 식별자 클래스를 지정하면 된다.
- 다대다 양방향 연관관계 설정하기
@Entity public class Product { @Id private String id; @ManyToMany (mappedBy = "products") // 역방향 추가 private List<Member>members; }복합 키를 위한 식별자 클래스의 특징
public class MemberProducted implements Serializable { private String member; private String product; @Override public boolean equals(Object o) {...} @Override public int hashCode() {...} }
- 복합 키는 별도의 식별자 클래스로 만들어야 한다.
Serializable을 구현해야 한다.- equals 와 hashCode 메소드를 구현해야 한다.
- 기본 생성자가 있어야 한다.
- 식별자 클래스는 Public 이어야 한다.
@IdClass를 사용하는 방법 외에@EmbeddedId를 사용하는 방법도 있다.
식별 관계 : 받아온 식별자를 기본 키 + 외래 키로 사용한다.
비식별 관계 : 받아온 식별자는 외래 키로만 사용하고 새로운 식별자를 추가한다.