연관관계 매핑시 주의할 점
- 다중성
- 단방향, 양방향
- 연관관계의 주인
다중성
- 다대일 : 중요
- 일대다 : 잘 안씀
- 일대일 : 별로 안씀
- 다대다 : 아예 안씀
단방향, 양방향
- 테이블 : 외래키 하나만 있어도 가능하니까 방향의 개념이 없다.
- 객체 : 한쪽에서 다른쪽을 보려면 참조를 해야한다. 그래서 방향이 있다.
(사실 양방향은 서로 단방향이 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 |