(1) 다대일
Last update: a year ago by nowwaterReading time: 2 min
다대일 관계
의 반대 방향은 항상 일대다 관계
일대다 관계
의 반대 방향은 항상 다대일 관계
외래 키는 항상 다쪽에 있다. -> 객체 양방향 관계에서 연관관계의 주인은 항상 다쪽이다.
6.1.1 다대일 단방향
회원은 Member.team
으로 팀 엔티티 참조 가능
반대로 팀에서 회원은 참조하는 필도가 없어서 참조 불가능
회원 엔티티
@Entitypublic 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 ......}
팀 엔티티
@Entitypublic class Team {@Id @GeneratedValue@Column(name = "TEAM_ID")private Long id;private String name;// Getter, Setter ......}
다대일 양방향
다대일 양방향의 객체 연관관계에서 실선이 연관관계의 주인(Member.team) 이고 점선(Team.members)은 연관관계의 주인이 아니다.
1. 양방향은 외래 키가 있는 쪽이 연관관계의 주인이다.
- 일다대와 다대일 연관관계는 항상 다(N)에 외래 키가 있다.
- 다쪽인 MEMBER 테이블이 외래 키를 가지고 있으므로
Member.team
이 연관관계의 주인
- JPA는 외래 키 관리 시 연관관계의 주인만 사용. 주인이 아닌
Team.members
는 조회를 위한 JPQL이나 객체 그래프 탐색할 때 사용
2. 양방향 연관관계는 항상 서로 참조해야 한다.
- 어느 한 쪽만 참조하면 양방향 연관관계가 성립하지 않는다.
- 연관관계 편의 메소드를 작성하여 양방향 연관관계를 하나의 메소드에서 처리하도록 한다.
회원 엔티티
@Entitypublic 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;@Entitypublic 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 ......}