[Member]
//연관관계 없는 경우
//@Column(name = "TEAM_ID")
//private Long teamId;
//연관관계 설정
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);
// 회원에 새 팀 설정
member.setTeam(teamB);
[Team]
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
List<Member> members = findMember.getTeam().getMembers();
for (Member m : members) {
System.out.println("m = " + m.getUsername());
}
연관관계의 주인과 mappedBy
객체와 테이블이 관계를 맺는 차이
객체의 양방향 관계
class A {
B b;
}
class B {
A a;
}
테이블의 양방향 연관관계
SELECT *
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)과 양방향 매핑 규칙
그래서 누구를 주인으로 정하는가?
다행히 내 프로젝트는 양방향 끼리는 잘 매핑되어있음
양방향 매핑 시 가장 많이 하는 실수 : 연관관계의 주인에 값을 입력하지 않음
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
// 역방향 (주인이 아닌 방향) 만 연관관계 설정
team.getMembers().add(member);
em.persist(member); // teamId null로 뜸
// 왜냐? Member가 연관관계의 주인인데 Member의 팀은 정해지지 않았음
// Team은 읽기 전용이므로 members에 member를 추가할 수 없음
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team); // 연관관계의 주인인 Member의 팀을 지정
team.getMembers().add(member); // 역방향 관계인 Team에도 member를 추가 (객체 관계 고려)
em.persist(member);
public void setTeam(Team team) {
this.team = team;
team.getMembers().add(this); // 역방향 세팅까지 같이
}