728x90
테이블
- 외래키 하나로 양쪽 조인가능
- 사실 방향이라는 개념이 없음
객체
- 참조용 필드가 있는 쪽으로만 참조 가능
- 한쪽만 참조하면 단방향
- 양쪽이 서로 참조하면 양방향
양방향은 단방향을 서로 보는것이 양방향이다.
테이블은 외래 키(기준이 되는 키) 하나로 두 테이블이 연관관계를 맺음
연관관계의 주인 :
이 그림에서 연관관계의 주인은 커스터머 이다
(mappedby = "customer")
외래키를 관리하는 참조 = 기준이된 키를 가지고 있는 객체가 주인 !!
주인의 반대편 = 외래키에 영향을 주지 않음 (단순 조회만 가능)
ex. 주문 테이블에서 사람에게 영향을 줄순 없다.
1. 두가지 테이블을 연결하는데 기준이 필요하다.
(manytoone / joincolumn) *다대일은 연관관계 주인이 되어야 한다
2. 그 기준을 정하고 기준이 되는 키를 가지고 있는 곳이 주인 !
(onetomany mappedby < 연관관계의 주인 필드를 선택>)
다 대 일 [N : 1]
A멤버는 1개의 팀을 가지고 있다.
멤버 = 다 / 팀 = 1
팀 이름을 따라 가야 한다. * [외래키(team_id) -> 멤버] * 에서 가지고 있어야 한다.
(멤버에 팀이름표가 붙여짐)
일 대 다 [N : 1] / 거의 사용하지 않음
팀에서 멤버들을 가지고 있는 형태
*다대일 일대다 양방향으로 관계를 많이 사용한다
- 1이 연관관계의 주인
- 테이블 일대다 관계는 항상 다 쪽에 외래키가 있다.
- 객체와 테이블 차이 때문에 반대편 테이블의 외래키를 관리하는 특이한 구조.
멤버의 id 를 팀이 관리 함. (멤버를 insert 할 때마다 팀에서 update 가 일어남;; 낭비 !!) - @JoinColumn을 꼭 사용해야 함 그렇지 않으면 조인테이블 방식을 사용함.
(중간에 테이블이 하나 생성 됌 - 성능상 낭비)
단점
- 엔티티가 관리하는 외래키가 다른테이블에 있음.
- 연관관계 관리를 위해 추가로 update를 실행 < 위 3번 예제
- 일대다 단방향 매핑보다 다대일 양방향 을 사용하자
일 대 일 [1 : 1]
- 주 테이블이나 대상 테이블 중에 외래키 선택가능 - 기준이 되는 곳에 외래키 추가
- 외래키에 데이터베이스 uinque 제약조건 추가
- 사물함과 멤버 1:1 관계가 매핑
- 멤버에 사물함객체를 넣고 멤버가 사물함의 외래키를 관리한다.
- 다대일(manytoone) 단방향 매핑과 유사 하다
- 양방향을 만들어주려면 양쪽 다 매핑하고 한쪽에 주인(mapped by)을 설정해주면 된다.
- *주테이블이 외래키 (주인객체가 외래키 까지 전부 들고 있는)를 들고있는 단방향을 주로 사용
public class Member{
@OneToOne
@JoinColumn(name = "locker_id)
private Locker locker;
}
//락커 OR 멤버 둘중 한곳에 넣어주면 된다.
다 대 다 [N : M]
- 실무에서 최대한 안쓰는게 좋음.
- 연결테이블을 추가해서 일대다 다대일 관계로 풀어내야함.
- 중간 테이블을 생성해서 관리 하게 된다
- @ManyToMany 사용
- @JoinTable로 연결 테이블 지정
- 다대다 매핑 : 단방향, 양방향 가능.
한계 극복 방법
- 연결 테이블용 엔티티 생성 [연결테이블을 엔티티로 생성(MemberProduct /ORDER)]
- @manytomany -> @onetomany , @manytoone
연결테이블엔티티 생성후
연결테이블에 어노테이션으로 중간 다리역활을 만들어줌.
@manytoone
@joincolumn (name = "member_id)
private Member member
@manytoone
@joincolumn (name = "product_id)
private Product product
//반대편 member와 product에는 onetomany/mappedby로 브릿지 엔티티와 연결
728x90
'개-발 > Java + Spring + Kotlin' 카테고리의 다른 글
[Spring] @PathVariable 어노테이션 (0) | 2023.01.01 |
---|---|
[Spring] RefreshToken +Jwt + Redis (feat.Redis) (0) | 2022.12.28 |
[Spring] 기본키 매핑 (Id , GeneratedValue) (0) | 2022.12.26 |
[Spring] 연관관계 맵핑 (0) | 2022.12.26 |
[JAVA] Stream / 중간연산 (0) | 2022.12.12 |