객체는 양방향 관계가 아니라 서로 다른 단방향 관계 2개다. 반면에 테이블은 외래 키 하나로 양방향으로 조인할 수 있다.
회원과 팀의 관계를 통해 다대일 단방향 관계를 알아보자.
데이터베이스 테이블은 외래 키 하나로 양방향으로 조회할 수 있다. 하지만 객체는 양방향 조회가 불가능 하기 때문에 다대다(N:M)을 다대일(N:1)과 일대다(1:N)로 나누어 매핑한다.
회원 객체에 다대일로 팀에 매핑을 했다면 팀 객체에 일대다로 매핑을 하면 양방향으로 매핑이 된다.
테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다.
엔터티를 단방향으로 매핑하면 참조를 하나만 사용하므로 이 참조로 외래 키를 관리하면 된다. 그런데 엔터티를 양방향으로 매핑하면 두 곳에서 서로를 참조하기 때문에 객체의 연관관계를 관리하는 포인트는 2곳으로 늘어난다.
엔터티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나다. 따라 둘 사이에 차이가 발생한다. 이러한 차이로 인해 JPA에서는 두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야 하는데 이것을 연관관계의 주인(Owner)이라고 한다.
연관관계의 주인은 mappedBy 속성을 사용하지 않는다.
연관관계의 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다.
연관관계의 주인을 정하는 것은 사실 외래 키 관리자를 선택하는 것이다. 연관관계의 주인은 외래 키가 있는 곳으로 정해야 한다. 여기서는 회원 테이블이 외래 키를 가지고 잇으므로 Member.team이 주인이 된다. 주인이 아닌 Team.members에는 mappedBy="team" 속성을 사용해서 주인이 아님을 설정한다.