1. 단방향 vs 양방향
1.1. 단방향
- 한 쪽만 참조하는 것
1.2. 양방향
- 양쪽 모두 서로 참조하는 것
사진을 보면 알 수 있듯이 방향은 객체관계에만 존재하고 테이블 관계는 항상 양방향
2. 양방향 연관관계
2.1. 객체 연관관계
- 회원→팀 (Member.team) : 다대일 관계
- 팀→회원 (Team.members) : 일대다 관계
2.2. 테이블 연관관계
- 외래 키 하나로 양방향으로 조회할 수 있다.
3. 양방향 연관관계 매핑
들어가기 앞서 . . .
회원→팀 (Member.team) : 다대일 관계
팀→회원 (Team.members) : 일대다 관계
3.1. 매핑한 회원 엔티티
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name = "member_id")
private Long id;
private String username;
@ManyToOne
@JoinColumn(name="team_id")
private Team team;
//연관관계 매핑
public void setTeam(Team team){
this.team=team;
}
//Getter, Setter...
}
- @ManyToOne: 회원→팀이 다대일(N:1)관계이므로
- @JoinColumn(name="team_id")
- 외래 키를 매핑할 때 사용
- name 속성에는 매핑할 외래 키 이름을 지정 (매핑할 테이블의 column 어노테이션 안의 name 값)
3.2. 매핑한 팀 엔티티
@Entity
@Getter
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "team_id")
private Long id;
private String name;
//====추가=====//
@OneToMany(mappedBy="team")
private List<Member> members = new ArrayList<Member>();
public void add(Member member){
member.setTeam(this);
this.members.add(member);
}
}
- @OneToMany: 팀→회원이 일대다 관계이므로
- @mappedBy
- Team.members는 연관관계의 주인이 아님을 설정
- mappedBy 속성의 값은 연관관게의 주인인 Member.team
4. 연관관계의 주인
- 연관관계의 주인은 테이블에 외래 키(FK)가 있는 곳으로 정한다
- N:1, 1:N관계에서는 항상 "다"쪽이 외래 키(FK)를 가진다.
→ 다 쪽인 @ManyToOne은 항상 연관관계의 주인이 되므로 mappedBy를 설정할 수 없다!
위 그림에서는 member 테이블이 외래 키 team_id를 가지고 있으므로 Member.team이 주인이 된다.
참고
- 자바 ORM 표준 JPA 프로그래밍
'Spring > JPA' 카테고리의 다른 글
[JPA] MultipleBagFetchException와 N+1문제 동시에 해결하기 (1) | 2023.09.24 |
---|---|
[JPA] entity에서 생성시간, 수정시간 반영하는 법 (1) | 2023.01.28 |
[JPA] Querydsl에서 ElementCollection Projection 할 때 에러-org.hibernate.QueryException: not an entity (0) | 2023.01.27 |
MapStruct를 이용해 Dto->Entity 변환하기 (0) | 2023.01.21 |