양방향 매핑
객체에 양방향 연관관계를 적용시키려면 위와 같이 구성해야한다.
하지만 RDB에서는 처음부터 양방향으로 접근해 조회할 수 있다.
이를 구성하려면 Team객체를 아래와 같이 변경하면 된다.
@Entity
public class Team{
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
// Collection 추가
List<Member> members = new ArrayList<>();
...
}
// 조회
Team findTeam = em.find(Team.class, team.getId());
// 역방향 조회
int memberSize = findTeam.getMembers().size();
연관관계의 주인과 mappedBy
- mappedBy는 처음에는 이해하기 어렵다.
- 객체와 테이블 간 연관관계를 맺는 차이를 이해해야 한다.
객체와 테이블 간 연관관계를 맺는 차이
- 객체 연관관계
- 회원 -> 팀 연관관계 1개(단방향)
- 팀 -> 회원 연관관계 1개(단방향)
- 테이블 연관관계
- 회원 <--> 팀의 연관관계 1개(양방향)
객체의 양방향 연관관계
- 실제로 객체의 방향은 무조건 단방향이다.
- 따라서, 양방향으로 조회를 하기 위해선 서로다른 단방향 관계 2개가 필여하다.
테이블의 양방향 연관관계
테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다.
이러한 차이를 해결하기 위해서는?
- 두 객체중 하나를 연관관계의 주인으로 설정한다.
- 연관관계를 외래키로 관리한다
연관 관계의 주인(Owner)
양방향 매핑 규칙
- 객체의 두 관계중 하나를 연관관계의 주인으로 지정
- 연관관계의 주인만이 외래 키를 관리(등록, 수정)
- 주인이 아닌 쪽은 읽기만 가능
- 주인은 mappedBy 속성 사용 x
- 주인이 아니면 mappedBy 속성으로 주인 지정
누구를 주인으로 해야할까?
- 외래 키가 있는 곳을 주인으로 정해라.(다른 테이블의 키를 참조하는 곳)
설계 시 양방향을 고려하지 않고 설계할 수 있게 된다.
- 단방향으로 설계해 둔 후 양방향이 필요할 경우 연관관계를 매핑만 하면 된다.
- DB는 어차피 양방향 조회가 가능하므로 영향을 끼치지 않는다.
양방향 매핑의 장점
- 단방향 매핑만으로도 이미 연관관계 매핑 완료
- 양방향 매핑은 반대 방향으로 조회(객체 그래프 탐색) 기능이 추가된 것 뿐
- JPQL에서 역방향으로 탐색할 일이 많다.
- 단방향 매핑을 잘 해두기만 하면 양방향은 필요할 때 추가하면 된다.(테이블에 영향 x)
연관관계 매핑 어노테이션
- @ManyToOne - 다대일
- @OneToMany - 일대다
- @OneToOne - 일대일
- @ManyToMany - 다대다
- @JoinColumn, @JoinTable
상속 관계 매핑 어노테이션
- @Inheritance
- @DiscriminatorColumn
- @DiscriminatorValue
- @MappedSuperclass(매핑 속성만 상속)
복합 키 어노테이션
- @IdClass
- @EmbeddedId
- @Embeddable
- @MapsId
'Study > JPA' 카테고리의 다른 글
[JPA] 객체 지향 쿼리 (0) | 2022.01.13 |
---|---|
[JPA] JPA 내부 구조 (0) | 2022.01.12 |
[JPA] 연관관계 매핑 (0) | 2022.01.11 |
[JPA] JPA 필드와 컬럼 매핑 (0) | 2022.01.10 |
[JPA] JPA 기본과 매핑 (0) | 2022.01.10 |