일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- java
- 영속성
- 스프링 입문을 위한 자바 객체 지향의 원리와 이해
- 김영한
- already use
- 테크잇
- 스프링부트
- 백준
- 알고리즘
- BFS
- 백엔드 스쿨3기
- 더티체킹
- 조회수중복
- 자바ORM표준JPA프로그래밍
- 인프런
- 시소 짝꿍
- 최주호
- 라이엇 API
- 멋쟁이사자차럼
- 포트 죽이는법
- 올리브영 고객센터
- JPA
- 인텔리제이 에러
- 전적 검색
- 카카오2023신입공채
- 자바
- 엔에첸
- 프로그래머스
- 리코쳇로봇
- DFS
- Today
- Total
My Blog
JPA에서 양방향 매핑의 규칙 본문
객체에는 양방향 연관관계라는 것이 없다. 서로 다른 단방향 연관관계 2개를 애플리케이션 로직으로 잘 묶어서 양방향인 것 처럼 보이게 할 뿐이다.
반면에 데이터베이스 테이블은 외래 키 하나로 양쪽이 서로 조인이 가능하다.
따라서 테이블은 외래 키 하나만으로 양방향 연관관계를 맺는다.
객체 연관관계의 예시는 다음과 같다
회원 -> 팀 연관관계 1개(단방향)
팀 -> 회원 연관관계 1개(단반향)
테이블 연관관계는 다음과 같다
회원 <-> 팀의 연관관계 1개(양방향)
JPA에서 이걸 사용하려면
회원과 팀을 예시로 들어보자.
회원 - 팀 이 있다면
OneToMany(일대다) = 한 회원은 여러 팀에 속할 수 있다.
ManyToMany(다대다) = 여러 회원은 여러 팀에 속할 수 있다.
ManyToOne(다대일) = 여러 회원은 한 팀에만 속할 수 있다.
OneToOne(일대일) = 한 회원은 한 팀에만 속할 수 있다.
예시가 부적절하긴한데 느낌만 익히면 될것같다.
아무튼 JPA에서 회원 클래스와 팀 클래스(둘다 Entity)라고 가정한다면
양방향 연관관계 매핑을 해줘야한다.
회원에서 ManyToOne을 해줬다면
팀 에서는 OneToMany를 해주면 된다.
그리고 여기서 중요한 게 연관관계에 주인을 정해야한다.
이걸 정해야 하는 이유는 엔티티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나다.
따라서 둘 사이에 차이가 발생한다. 이런 차이로 인해 JPA에서는 두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야 하는데 이것을 연관관계의 주인 이라 한다.
연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리(등록, 수정, 삭제)할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수있다.
mappedBy속성을 사용하는 쪽이 주인이아니다.
연관관계의 주인은 외래 키가 있는 곳.
참고
데이터베이스 테이블의 다대일, 일대다 관계에서는 항상 다 쪽이 외래 키를 가진다. 다 쪽인 ManyToOne은 항상 연관관계의 주인이 되므로 mappedBy를 설정할 수 없다. 따라서 @ManyToOne에는 mappedBy 속성이 없다.
'CS' 카테고리의 다른 글
운영체제의 종류 (0) | 2023.05.08 |
---|---|
CPU 스케줄링, 디스크 스케줄링 (0) | 2023.05.08 |