@JoinColumn
은 DB 관점으로 보았을 때,
본인이 외래 키를 관리하며 상대 Table의 PK(join할 때 사용)를 명시해주는 역할을 한다.
mappedBy
옵션은 보통, 객체간 연관관계가 양방향일 경우 사용한다.
연관관계의 주인은 mappedBy
옵션을 사용하지 않고 반대쪽 객체에서 사용한다.
이때, 연관관계의 주인이란 FK를 가지고 있는 객체를 의미한다.
👉🏻 무조건 FK를 가지고 있는 객체가 아닌, FK를 관리하는 객체라고 보는 것이 맞을 것 같다. 일대다 단방향에서 예외가 존재한다. (예외에 대해서도 알아보자)예시
Team 하나에 여러 Member가 들어갈 수 있다.
Member 한 명은 소속 Team이 한 개다.Team : Member = 1 : N
이 경우, DB 관점에서 보았을 때 Member가 Team의 id를 FK로 가지게 된다. 즉, Member가 FK를 가지고 있으므로 연관관계의 주인이 된다.
@Entity
@Table(name = "student")
public class Student {
@Id
@Column(name = "id")
private String id;
@Column(name = "name")
private String username;
@ManyToOne
@JoinColumn(name = "teacher_id")
private Teacher teacher;
}
@Entity
@Table (name = "teacher")
public class Teacher {
@Id
private String id;
private String name;
@OneToMany(mappedBy = "teacher")
private List<Student> students = new ArrayList<>();
}
연관관계의 주인은 어떻게 정해주면 될까?
연관관계의 주인은 1:N 의 경우 N 쪽으로 정해주면 된다.
연관관계의 주인을 설정할 때 주인을 따로 설정하는 것이 아니라,
자신이 이 연관관계의 주인이 아님을 설정해줘야 한다.
@OneToMany(mappedBy = "teacher")
위와 같은 포맷이고 mappedBy
의 값은 반대쪽에 자신이 매핑되어 있는 필드명을 써주면 된다.
예제의 경우는 TEACHER
자신이 STUDENT
의 teacher
에 매핑되어 있으므로 teacher
로 설정해준 것이다.
추가적으로 @JoinTable 도 알아보도록 하자.
https://velog.io/@dhk22/JPA-%EC%96%91%EB%B0%A9%ED%96%A5-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84