다 대 일
N : 1 관계의 반대 방향은 항상 1 : N 관계입니다. 반대도 항상 동일합니다.
DB 테이블의 1, N 관계에서 외래 키는 항상 N쪽에 있습니다.
따라서 객체 양방향 관계에서 연관관계의 주인은 항상 N쪽입니다.
예를들어 회원(N)과 팀(1)이 있으면 회원 쪽이 연관관계의 주인입니다.
N : 1 [ 다대일 단방향 ]
회원은 Member.team으로 팀 엔티티를 참조할 수 있지만
반대로 팀에는 회원을 참조하는 필드가 없습니다.
따라서 회원과 팀은 N : 1 단방향 연관관계입니다.
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
@JoinColumn(name = "TEAM_ID")를 사용해서 Member.team필드를 TEAM_ID외래 키와 매핑했습니다.
따라서 Member.team필드로 회원 테이블의 TEAM_ID외래키를 관리하게됩니다.
N : 1, 1 : N [ 다대일 양방향 ]
객체의 연관관계의 주인은 Member.team이고 Team.members은 연관관계의 주인이 아닙니다.
public class Member {
@Id
@Column(name="MEMBER_ID")
private String id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
// 연관관계 설정
public void setTeam(Team team) {
this.team = team;
if (!team.getMembers().contains(this)) {
team.getMembers().add(this);
}
}
// Getter, Setter...
}
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
public void addMember(Member members) {
this.members.add(members);
if (members.getTeam() != this) {
members.setTeam(this);
}
}
}
양방향은 외래키가 있는 쪽이 연관관계의 주인입니다.
1 : N, N : 1 연관관계는 항상 N에 외래키가 있습니다.
여기서 N 쪽인 MEMBER테이블이 외래 키를 가지고있으므로 Member.team이 연관관계의 주인입니다.
JPA는 외래 키를 관리할 때 연관관계의 주인만 사용합니다.
주인이 아닌 Team.members는 조회를 위한 JPQL이나 객체 그래프를 탐색할 때 사용합니다.
양방향 연관관계는 항상 서로를 참조해야 합니다.
어느 한 쪽만 참조하면 양방향 연관관계가 성립되지 않습니다.
setTeam(), addMember() 메소드가 이런 편의 메소드들입니다.
이런편의 메소드들을 사용할때는 무한루프에 빠지지지않도록 주의해야합니다.