연관관계 매핑
- 객체의 참조와 테이블의 외래 키를 매핑하는 것
게시판 예제
Answer(답변)
Question(질문)
@ManyToOne란 ?
N:1
, 한 개의 Question(질문)은 여러개 Answer(답변)을 가질 수 있으므로 Answer 기준으로 @ManyToOne을 선언합니다.
@OneToMany란 ?
1:N
, 여러개 Answer(답변)은 한 개의 Question(질문)에 등록될 수 있으므로 Question 기준으로 @OneToMnay를 선언합니다.
mappedby란 ?
- JPA로 연관 관계를 설정할 때 가장 헷갈렸던 부분이었다. mappedby는 선언된 필드의 소유자가 누구인지 알려주기 위한 파라미터이다.
따라서, Question의 answerList필드는 반대의 Answer의 question필드라는 것이다.
- 즉, 연관관계 주인은 mappedBy속성으로 정해주고, 주인은 mappedBy속성을 사용하지 않는다.
@JoinColumn
@JoinColumn
은 외래 키 매핑 시 사용한다.
- 속성
name
: 필드에 저장되는 외래 키 컬럼명
- default : [필드명]_[참조하는 테이블(question)의 기본키 컬럼명(id)]
referencedColumnName
: 외래 키가 참조하는 대상 테이블의 컬럼명
- default : 참조하는 테이블(question)의 기본키 컬럼명(id)
unique
: @Column 속성과 동일
nullable
columnDefinition
연관관계 주인
- 객체에서의 연관관계는 "서로 다른 단방향 연관관계 2개"와 같다.
- 엔티티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나가 되므로, 차이가 발생한다.
- 이를 해결하기 위해 JPA에서는 두 객체 연관관계 중 하나를 정해서, 테이블의 외래키를 연관관계의 주인으로 관리한다.