Member 에서 값을 바꿀 수도 있고 Team 의 members 에서도 Member 의 값을 바꿀 수 있으니 한쪽을 주인으로 정해야 한다는 것
이 개념이 연관관계의 주인이다
연관관계의 주인(Owner)
양방향 매핑 규칙
객체의 두 관계중 하나를 연관관계의 주인으로 지정
연관관계의 주인만이 외래 키를 관리(등록, 수정)
주인이 아닌쪽은 읽기만 가능하게 설정한다
주인은 mappedBy 속성 사용하지 않는다
주인이 아니면 mappedBy 속성으로 주인 지정
외래 키가 있는 있는 곳을 주인으로 정해라
위 그림에서는 Member.team 이 연관관계의 주인이다
양방향 매핑시 가장 많이 하는 실수
연관관계의 주인에 값을 입력하지 않음
TestMember member = new TestMember();
member.setName("member1");
em.persist(member);
Team team = new Team();
team.setName("TeamA");
team.getMembers().add(member);
em.persist(team);
tx.commit();
위와 같이 연관관계의 주인에 값을 입력하지 않고 사용측에서 값을 입력하면 team_id 가 들어가지 않게 된다
양방향 매핑시 연관관계의 주인에 값을 입력해야 한다
객체지향적으로 생각을 해보면 양쪽으로 값을 모두 셋팅해주는게 맞다
양쪽에 값을 모두 셋팅하자
Team team = new Team();
team.setName("TeamA");
em.persist(team);
TestMember member = new TestMember();
member.setName("member1");
// 연관관계의 주인에 값을 설정한다
member.setTeam(team);
team.getMembers().add(member); // 실수할 가능성이 높음
em.persist(member);
// 위와 같이 셋팅하면 실수할 가능성이 높기 때문에 아래처럼 사용
// 연관관계 편의 메서드 : TestMember 에 team 이 설정되는 경우 team 에서 자동으로 Members 에 값을 넣어주게 설정한다
@Entity
@Table(name = "TEST_MEMBER")
public class TestMember {
....
public void setTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
}