5-1 용어
- 방향(
Direction
): 단방향, 양방향
- 다중성(
Multiplicity
): 다대일(N:1
), 일대다(1:N
), 일대일(1:1
), 다대다(N:M
)
- 연관관계의 주인(
Owner
): 객체 양방향 연관관계는 관리 주인이 필요
5-2 연관관계가 필요한 이유
@Entity
public class Member {
@Id
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID")
private Long teamId;
}
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
}
//조회
Member findMember = em.find(Member.class, member.getId());
//연관관계가 없음
Team findTeam = em.find(Team.class, team.getId());
테이블 : 외래키 조인
vs
객체 : 참조
- 객체를 테이블에 맞춰 모델링
- 연관관계 탐색
객체 그래프 탐색
: 객체
는 참조
를 사용해 연관관계를 탐색
조인
: DB
는 외래 키
를 사용해 연관관계를 탐색
5-3 단방향 연관관계
@Entity
public class Member {
@Id
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@JoinColumn(name = "TEAM_ID")
외래 키
를 매핑할 때 사용한다.
name
속성에는 매핑할 외래 키
이름을 지정한다.
- 회원과 팀 테이블은
TEAM_ID
외래 키로 연관관계를 맺으므로 이 값을 지정하면 된다.
- 생략 시 기본값 :
필드명
+ _
+ 참조하는 테이블의 기본 키 컬럼명
public class MainJPA {
public static void main(String[] args) {
//팀 저장
Team team = new Team("TeamA");
em.persist(team);
//회원 저장
Member member = new Member("member1", team); //단방향 연관관계 설정, 참조 저장
em.persist(member);
//조회
Long id = member.getId();
Member findMember = em.find(Member.class, id);
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
// 새로운 팀B
Team teamB = new Team("TeamB");
em.persist(teamB);
// 회원1에 새로운 팀B 설정
member.setTeam(teamB);
}
}
5-4 양방향 연관관계
@Entity
public class Member {
@Id
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
}
5-5 연관관계의 주인과 mappedBy
@OneToMany(mappedBy = "team")