작성
·
462
·
수정됨
0
강의에서 외래키가 있는 쪽으로 연관관계의 주인을 설정하라고 들었는데,
어노테이션을 보니 @OneToMany에만 mappedBy속성이 있고, @ManyToOne에는 mappedBy 속성이 없습니다.
보통 DB에서 외래키는 1:N관계에서 N쪽에서 가지고 있습니다. 그런데 @ManyToOne에 mappedBy가 없고 @OneToMany에만 mappedBy가 있다는 것은 JPA에서 외래키가 있는 방향으로만 연관관계 주인을 설정하도록 막아놓은건가요?
그리고 아직 속성값의 이름이 왜 mappedBy인지 잘 와닿지가 않습니다. members 필드는 단순히 team에 의해 맵핑만 당한다는 의미로 보면 되나요?
답변 2
0
안녕하세요. 나무님, 공식 서포터즈 David입니다.
네, 관계형 데이터베이스 특성상 다(N)쪽에 외래키가 존재하기 때문입니다.
이런 부분을 JPA도 알고 있기에 스펙에서도 다음과 같은 규칙들을 명시해 놓았습니다.
The following rules apply to bidirectional relationships: • The inverse side of a bidirectional relationship must refer to its owning side by use of the mappedBy element of the OneToOne, OneToMany, or ManyToMany annotation. The mappedBy element designates the property or field in the entity that is the owner of the relationship. • The many side of one-to-many / many-to-one bidirectional relationships must be the owning side, hence the mappedBy element cannot be specified on the ManyToOne annotation. • For one-to-one bidirectional relationships, the owning side corresponds to the side that contains the corresponding foreign key. • For many-to-many bidirectional relationships either side may be the owning side.
https://download.oracle.com/otn-pub/jcp/ejb-3_0-fr-eval-oth-JSpec/ejb-3_0-fr-spec-persistence.pdf
mappedBy라는 이름은 "이 필드가 다른 엔티티의 어떤 필드에 의해 매핑되었는가?"를 나타냅니다.
여기서 "매핑된다"는 의미는 "연결된다"나 "관계를 설정한다"와 같은 의미입니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요.
JPA에서는 양방향 연관관계를 설정할 때 하나의 객체를 연관관계의 주인으로 정해야 합니다. 이 주인 객체만이 데이터베이스에 실제로 영향을 주는 것이죠.
@OneToMany에서는 mappedBy 속성을 사용하여 연관관계 주인을 설정합니다. mappedBy 속성은 해당 필드가 연관관계의 주인이 아닌 반대편(Many)에서 매핑된 필드의 이름을 지정하는 것입니다. 그러므로, 연관관계 주인 객체에서는 mappedBy 속성을 사용할 필요가 없습니다.
즉, @OneToMany쪽에서는 mappedBy를 사용하여서 연관관계를 설정하고, @ManyToOne쪽에서는 mappedBy를 사용할 필요가 없기 때문에 mappedBy 속성이 없습니다.
members 필드가 mappedBy로 맵핑된다는 것은 members 필드가 team쪽에서 맵핑된다는 의미입니다. 즉, members 필드는 연관관계 주인(team)의 외래키와 맵핑된다는 것을 의미합니다.
이렇게 함으로써 JPA는 연관관계 주인의 필드에만 실제로 데이터베이스에 영향을 주도록 하여 데이터의 일관성을 유지할 수 있게 됩니다.
더 자세한 내용은 JPA 관련 문서나 강의를 참고하시면 도움이 될 것 같습니다. 감사합니다.