티스토리 뷰
ORM에서의 객체 연관 매핑
연관 관계의 핵심 키워드
방향
매핑 방식에는 크게 단방향 / 양방향 방식이있다.
단방향
- 한쪽 방향으로의 접근이 가능한 매핑으로
회원 -> 팀
혹은팀 -> 회원
방식
- 한쪽 방향으로의 접근이 가능한 매핑으로
양방향
- 양방향 으로의 접근이 가능한 매핑으로
회원 <--> 팀
서로의 객체를 참조하는 방식이다.
- 양방향 으로의 접근이 가능한 매핑으로
단, 이러한 관계는 객체 관계에서만 가능하고 테이블 관계는 항상 양방향 상태이다.
다중성
다대일 / 일대다 / 일대일 / 다대다
연관관계 주인
객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야한다.
테이블과 객체의 연관관계 차이
객체
- 객체는 필드(멤버변수)로 팀 객체와 연관관계를 맺는다.
테이블
- 테이블은 외래 키로 연관관계를 가진다.
여기서 확인해야 할 것은 테이블은 외래키를 가지게 된다면 자동으로 양방향 테이블을 가지게 된다.
그러나 객체 관계에서는 단방향을 기본으로 가지게 된다.
여기서 첫번째 ORM 패러다임을 발견하게 되는데 개발자는 필요하다면 양방향으로 데이터를 바꿔줄 수 있다.
JPA 객체 관계 매핑
JPA에서 제공하는 @JoinColumn
어노테이션은 대상 객체의 요소를 를 자신의 외래 키로 사용하도록 해준다.
요소는 객체의 유일성
을 가지는 PK가 적합하다.
연관 관계 주인
객체에는 양방향 연관관계의 개념은 존재하지 않는다.
단지, 서로다은 단방향 연관관계 2개를 애플리케이션 로직으로 묶어서 양방향 처럼 보이게 할 뿐인 것이다.
쉽게 말하면 객체에서의 양방향은 2개의 단방향을 하나로 묶은 방식인것이다.
결국 사용자가 데이터에 접근하면 2개의 객체로 하나의 외래키를 가지게되는 아이러니한 상황이 나타나는 것이다.
JPA는 이러한 패러다임을 해결하기 위해 두 객체의 연관관계 중 한쪽을 정하여 테이블의 외래 키를 관리하는 방식을 제공한다.
주인의 역할
연관관계의 주인만이 DB 연관관계와 매칭되고 외래 키를 관리 할 수 있다.
- 주인은
mappedBy
속성을 사용하지 않는다. - 주인이 아니면
mappedBy
속성을 사용하여 연관관계 주인을 지정해야한다.
데이터 베이스 테이블의 다대일, 일대 다 관계에서는 항상 다 쪽이 외래키를 가진다.
@ManytoOne
은 항상 연관관계의 주인이 되므로 mappedBy를 설절할 수 없다. 따라서 @ManyToOne
에는 mappedBy 속성이 없다.
만약 회원 엔티티에 있는 Member.team을 주인으로 선택하면 자기 테이블에 있는 외래 키만을 관리하면 되기 때문이다.
양방향 연관 관계 주의점
양방향 관계에서 연관관계 주인의 입력을 하지 않고 그 반대 만을 저장하지 않도록 주의하자.
연관관계 편의 메소드
양방향 연관관계에서 결국 양쪽을 모두 신경써야 한다면 하나의 코드처럼 사용하는 것이 좋다.
그러나 팀 - 멤버
관계에서 외래키를 가지는 멤버 엔티티의 외래키가 바뀔경우 기존의 외래키를 삭제하고
새로운 키를 입력해 주어야한다.
public class Member{
private Team team;
public void setTeam(Team team){
if(this.team != null){
this.team.getMembers().remove(this);
}
this.team=team;
team.getMembers().add(this);
}
}
'JPA' 카테고리의 다른 글
임베디드 타입, 엔티티 타입 (0) | 2022.05.13 |
---|---|
JPA 에서의 식별과 비식별 (0) | 2022.05.12 |
SQL Mapper vs ORM (0) | 2022.05.10 |
JPQL(Java Persistence Query Language) (0) | 2022.05.09 |
Hibernate (0) | 2022.05.08 |
- Total
- Today
- Yesterday
- Solid
- 백준
- 스프링부트
- 자격증
- Algorithm
- 릿코드
- 수학
- kakao
- Matlab
- JPA
- nginx
- OOP
- CS
- 자바
- 매트랩
- Spring
- docker
- spring-cloud
- security
- interview
- 프로그래머스
- java
- 디자인패턴
- 면접
- 스프링
- 그래프
- 알고리즘
- C언어
- springboot
- ajax
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |