다양한 연관관계 매핑
연관관계를 매핑할 때 고려하는 3가지
- 다중성
- 단방향, 양방향
- 연관관계의 주인
다중성
- 다대일: 단방향, 양방향
- 일대다: 단방향, 양방향
- 일대일: 주 체이블 단방향, 양방향
- 일대일: 대상 테이블 단방향, 양방향
- 다대다: 단방향, 양방향
다대일
외래키는 항상 다쪽에 있으므로 객체 양방향 관계에서 연관관계의 주인은 항상 다쪽이다.
다대일 단방향 예시
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
다대일 양방향 예시
@OneToMany(mappedBy="team")
private List<Member> members = new ArrayList<Member>();
일대다
엔티티를 하나 이상 참조할 수 있으므로 자바 컬렉션인 Collection, List, Set, Map 중에 하나를 사용해야 한다.
일대다 단방향 매핑의 단점
매핑한 객체가 관리하는 외래 키가 다른 테이블에 있다는 점이다. 본인 테이블에 외래 키가 있으면 저장과 연관관계 처리를 Insert SQL 한 번으로 끝낼 수 있지만, 다른 테이블에 있으면 연관관계 처리를 위한 Update SQL을 추가로 설정해야 한다.
그러므로 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용해야 한다.
일대다 양방향 매핑 예시
@ManyToOne
@JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
private Team team;
일대다 단방향 매핑 반대편에 다대일 단방향 매핑을 추가하였는데, 이 경우 둘 다 같은 키를 관리하기 때문에 문제가 발생할 수 있다. 따라서 반대편인 다대일 쪽을 위와 같이 설정해서 읽기만 가능하게 한다.
일대일
일대일 관계는 주 테이블이나 대상 테이블 둘 중 어느곳이나 외래키를 가질 수 있다.
다대다
관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
그래서 위와 같은 구조를 아래와 같이 정규화 한다.
하지만 객체는 테이블과 다르게 객체 2개로 다대다 관계를 만들 수 있다.
@ManyToMany를 통해 중간테이블이 자동으로 생기는 것을 볼 수 있다.
'Backend > Spring Boot' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 8장 (1) | 2023.05.23 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 7장 (0) | 2023.05.23 |
[Spring Boot] AWS S3 연결이 비공개로 설정되어 있지 않습니다. (0) | 2023.04.24 |
[Spring Boot] AWS S3 연결 - 다중 파일 업로드 (0) | 2023.04.20 |
[Spring Boot] @modelAttribute로 여러 개의 파일과 단일 데이터 바인딩 (1) | 2023.04.19 |