EP7. 다양한 연관관계 매핑
Web/JPA

EP7. 다양한 연관관계 매핑

연관관계 매핑시 주의할 점

  • 다중성
  • 단방향, 양방향
  • 연관관계의 주인

 

다중성

  • 다대일 : 중요
  • 일대다 : 잘 안씀
  • 일대일 : 별로 안씀
  • 다대다 : 아예 안씀

 

단방향, 양방향

  • 테이블 : 외래키 하나만 있어도 가능하니까 방향의 개념이 없다.
  • 객체 : 한쪽에서 다른쪽을 보려면 참조를 해야한다. 그래서 방향이 있다.
    (사실 양방향은 서로 단방향이 2개 있는 것이다.)

 

연관관계의 주인 

외래키가 있는 곳

 

 

 

다양한 연관관계 매핑 방법

다 대 일 : @ManyToOne

단방향

외래키가 있는 곳에 참조를 넣고 매핑시킨다.

 

코드

 

Member

@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;

 

 

 

양방향

다대일 관계에 일대다를 추가한 것이 양방향이다.

(추가해준다해도 테이블에 영향이 없다.)

 

Member

@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;

Team

@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> members = new ArrayList<>();

 

 

일대일

  • 주테이블, 대상테이블 둘 중 한곳에 외래키 선택이 가능하다.
  • 외래키에는 데이터베이스에 유니크 제약조건을 걸어야한다.

 

주 테이블에 외래키 단방향

 

다대일 단방향 매핑과 거의 유사하다.

 

 

코드

 

Member

@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;

 

 

주 테이블에 외래키 양방향

 

외래키가 있는 곳이 연관관계의 주인이다.

주 테이블(Member)에 외래키

 

코드

 

Member

@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;


Locker

@OneToOne(mappedBy = "locker")
private Member member;

 

 

 

대상 테이블에 외래키

주테이블이 어떤것이라고 정하든 사실 매핑방법은 같다.

 

근데 비즈니스적으로 나중에 일대일에서 다대일로 바뀌는 상황일 때 외래키가 '다' 쪽에 있는것이 바꾸기가 쉽다.

 

 

다대다

안쓴다

왜? : 관계형 DB로 다대다를 표현할 수 없다

그럼 어떻게? : 연결테이블을 추가해서 일대다, 다대일 관계로 풀어내야한다.

 

Member_Product 라는 연결테이블을 추가해서 일대다, 다대일 관계로 풀어냈다.

 

여기서 Member_Product 의 PK 는 FK 두개를 묶은 (MEMBER_ID, PRODUCT_ID) 이다.

하지만 엔티티는 평생 고정된다는 보장이 없다. 엔티티가 바뀌면 특정 PK가 특정 FK에 종속되어 있을때 확장시키기 어려울 수 있다.

 

그냥 아예 새로운 PK (ORDER_ID) 를 두고, FK 2개는 그대로 두자.

 

 

 

 

 

 

헷갈렸던 어노테이션 @JoinColumn

외래 키를 매핑할 때 사용한다.

속성 설명 기본값
name 매핑할 외래 키 이름 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명
referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명 참조하는 테이블의 기본키 컬럼명
foreignKey(DDL) 외래 키 제약조건을 직접 지정할 수 있다.
이 속성은 테이블을 생성할 때만 사용한다.
 

 

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

EP9. 프록시와 연관관계 관리  (0) 2021.02.10
EP8. 고급 매핑  (0) 2021.02.09
EP6. 연관관계 매핑 (실전예제)  (0) 2021.02.06
EP5. 연관관계 매핑  (0) 2021.02.05
EP4. 요구사항 분석과 기본 매핑  (0) 2021.02.04