728x90
반응형
다양한 연관관계 맵핑
연관관계 맵핑의 종류에 대해 알아보자.
연관관계 맵핑의 종류
- N:1
- 1:N
- 1:1
- N:M
연관관계 어노테이션 종류
- @ManyToOne: N:1
- @OneToMany: 1:N
- @OneToOne: 1:1
- @ManyToMany: N:N 실무에서는 안쓴다.
용어
단방향 , 양방향
- 단방향: A 와 B 테이블이 있을때 A -> B 한방향으로 참조하는 것이다.
- 양방향은: A 와 B 테이블이 있을때 A->B, A<-B 양쪽으로 참조하는것이다.
- 테이블의 방향성
- 외래키 하나로 양쪽 조인가능
- 방향 개념이 없다 - 객체의 방향성
- 참조용 필들가 있는 쪽으로만 참조가능
- 한쪽만 참조하면 단방향
- 양쪽이 서로 참조하면 양방향
연관관계 주인
- 테이블은 외래 키 하나로 두테이블이 연관관계를 맺는다.
- 객체 양방향 관계는 참조가 두군데이다.
- 객체 양방향 관계일때는 외래키를 관리할 곳을 지정해햐된다.
- 연관관계의 주인: 외래 키를 관리하는 참조이다.
- 주인의 반대편: 외래키에 영향을 주지 않는다. 단순한 조회만 가능한다.
연관관계 맵핑 분석
다대일 [N:1] 단방향
- 가장많이 사용하는 연관관계이다.
- 다대일의 반대는 일대다이다.
- @JoinCoulmn 을 사용하여 구현한다.
다대일 [N:1] 양방향
- 외래키가 있는 쪽이 연관관계 주인이다.
- 양쪽을 서로 참조하도록 개발한다.
- N에는 @ManyToOne 와 @JoinColumn 사용
- 1에는 @OneToMany를 사용하여 구현한다.
일대다 [1:N] 단방향
- 잘안쓰는 방법이다.
- 실무에서 사용하면 운영이 힘들어진다.
- Team 에 members를 수정하면 MEMBMER 에 있는 외래 키를 업데이트 해줘야 한다.
- 그럼 Member 테이블에서 업데이트 쿼리가 발생한다.
- 수정한 쪽은 Team 인데 MEMBER에도 쿼리가 나간다.
- 1. Member Insert 쿼리 발생
- 2. Team Inset 쿼리발생
- 3. Member FK 업데이트 발생
- N:1을 쓰자.
- N:1 과 차이점
- 1 이 되는 쪽이 주인이 된다.
- 반드시 @JoinColum 을 써야한다 그렇지 않으면 TableJoin이 되어 테이블이 하나더 생성된다.
일대다 [1:N] 양방향
존재 하지 않는다.
일대일 [1:1] 단방향
- 일대일 관계는 그밴다도 일대일
- 주테이블 이나 대상 테이블 중에 외래키 선택 가능하다.
- 외래키에 데이터 베이스 유니크 제약 조건 추가.
- N:1 단방향 매핑과 유사하다.
구현
Member
package directionmapping.onetoone;
import javax.persistence.*;
// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
//@Table(name = "USER") // 테이블명 지정
public class OneToOenMember {
@Id //PK 설정
@GeneratedValue
@Column(name = "OTO_MEMBER_ID")
private Long id;
// 컬럼이름을 지정해준다.
private String name;
@OneToOne
@JoinColumn(name = "OTO_LOCKER_ID")
private Locker locker;
}
Locker
package directionmapping.onetoone;
import javax.persistence.*;
@Entity
public class Locker {
@Id @GeneratedValue
@Column(name = "OTO_LOCKER_ID")
private Long id;
private String name;
}
일대일 [1:1] 양방향
Locker 만 변경하면 된다.
package directionmapping.onetoone;
import javax.persistence.*;
@Entity
public class Locker {
@Id @GeneratedValue
@Column(name = "OTO_LOCKER_ID")
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
}
참고: https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21703?tab=curriculum
728x90
반응형
'DataBase > JPA' 카테고리의 다른 글
[JPA] @MappedSuperclass (0) | 2021.08.09 |
---|---|
[JPA] 고급 매핑1: 상속관계 맵핑 (0) | 2021.08.08 |
[JPA] 연관관계 매핑기초5: 예제 (0) | 2021.08.04 |
[JPA] 연관관계 매핑기초4: 정리 (0) | 2021.08.03 |
[JPA] mappedBy (0) | 2021.08.02 |
댓글