쉽게 예제로 설명
회원과 팀이 있고, 회원은 하나의 팀에만 소속될 수 있다. (회원과 팀은 다대일 관계)
연관관계가 없는 객체
추구 방향
연관관계가 있는 객체
테이블의 변화는 없고, 사용하는 객체에서 외래키가 아닌 Team 객체를 선언해서 사용
그럼 Member 조회 > team 조회가 바로 가능하다.
저장 시
// 팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
// 회원 저장
Member member = new Member();
member.setName("member1");
member.setTeam(team); // 단방향 연관관계 설명, 참조 저장
em.persist(member);
참조로 연관관계 조회 - 객체 그래프 탐색
//조회
Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
수정 시
// 새로운 팀B
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);
//회원1에 새로운 팀B 설정
member.setTeam(teamB);
- 객체 연관관계 = 2개
- 회원 > 팀 연관관계 1개 (단방향)
- 팀 > 회원 연관관계 1개 (단방향)
- 테이블 연관관계 = 1개
- 회원 <> 팀의 연관관계 1개(양방향)
여기서 이해해야할 포인트는 단방향, 양방향 관계는 사실상 구분하기 위한 것이고 회원(팀)을 알기 위해서는 팀(회원)의 정보가 필요하니까 단방향이고,
테이블에서의 연관관계는 FK 하나면 양쪽에서의 조회가 가능하니까 양방향이라고 생각하면 된다.
정리 (중요한 의미라 한번 더 설명)
객체의 양방향 연관관계 (객체!!)
테이블의 양방향 연관관계
SELECTR * FROM MEMBER M JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
SELECT * FROM TEAM T JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
그래서 둘 다 외래키를 갖고 있으니까 둘 중 하나로 외래 키를 관리해야 한다.
연관관계 주인 ( Owner )