Close
Close full mode
logo만렙 개발자 키우기

(1) 다대일

Git RepositoryEdit on Github
Last update: a year ago by nowwaterReading time: 2 min

다대일 관계의 반대 방향은 항상 일대다 관계

일대다 관계의 반대 방향은 항상 다대일 관계

외래 키는 항상 다쪽에 있다. -> 객체 양방향 관계에서 연관관계의 주인은 항상 다쪽이다.

6.1.1 다대일 단방향

회원은 Member.team으로 팀 엔티티 참조 가능

반대로 팀에서 회원은 참조하는 필도가 없어서 참조 불가능

image

회원 엔티티

@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // TEAM_ID 외래 키와 매핑
private Team team;
// Getter, Setter ...
...
}

팀 엔티티

@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
// Getter, Setter ...
...
}

다대일 양방향

다대일 양방향의 객체 연관관계에서 실선이 연관관계의 주인(Member.team) 이고 점선(Team.members)은 연관관계의 주인이 아니다.

image

1. 양방향은 외래 키가 있는 쪽이 연관관계의 주인이다.

  • 일다대와 다대일 연관관계는 항상 다(N)에 외래 키가 있다.
  • 다쪽인 MEMBER 테이블이 외래 키를 가지고 있으므로 Member.team 이 연관관계의 주인
  • JPA는 외래 키 관리 시 연관관계의 주인만 사용. 주인이 아닌 Team.members 는 조회를 위한 JPQL이나 객체 그래프 탐색할 때 사용

2. 양방향 연관관계는 항상 서로 참조해야 한다.

  • 어느 한 쪽만 참조하면 양방향 연관관계가 성립하지 않는다.
  • 연관관계 편의 메소드를 작성하여 양방향 연관관계를 하나의 메소드에서 처리하도록 한다.

회원 엔티티

@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID") // TEAM_ID 외래 키와 매핑
private Team team;
public void setTeam(Team team){
this.team = team;
// 무한루프에 빠지지 않도록 체크
if(!team.getMembers().contains(this)){
team.getMembers().add(this);
}
}
// Getter, Setter ...
...
}

팀 엔티티

import java.util.ArrayList;
@Entity
public class Team {
@Id
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
public void addMember(Member member){
this.members.add(member);
if(member.getTeam != this) { // 무한루프에 빠지지 않도록 체크
member.setTeam(this);
}
}
// Getter, Setter ...
...
}
🚀 JPA — Previous
6장. 다양한 연관관계 매핑
Next — 🚀 JPA
(2) 일대다