JPA 연관관계 매핑 - 다중성 (다대다 관계 )

Growing_HJ·2024년 7월 30일

JPA

목록 보기
8/15

다대다 관계 [ N : N ] - @ManyToMany

관계형 데이터베이스는 정규화된 테이블 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() {...}
}
  1. 복합 키는 별도의 식별자 클래스로 만들어야 한다.
  2. Serializable 을 구현해야 한다.
  3. equals 와 hashCode 메소드를 구현해야 한다.
  4. 기본 생성자가 있어야 한다.
  5. 식별자 클래스는 Public 이어야 한다.
  6. @IdClass 를 사용하는 방법 외에 @EmbeddedId 를 사용하는 방법도 있다.

식별 관계 & 비식별 관계

식별 관계 : 받아온 식별자를 기본 키 + 외래 키로 사용한다.
비식별 관계 : 받아온 식별자는 외래 키로만 사용하고 새로운 식별자를 추가한다.

0개의 댓글