@JoinColumn & mappedBy

김형준 Kim Hyeong Jun·2022년 12월 6일
0
post-thumbnail

@JoinColumn

@JoinColumn은 DB 관점으로 보았을 때,
본인이 외래 키를 관리하며 상대 Table의 PK(join할 때 사용)를 명시해주는 역할을 한다.

mappedBy

너는 지금 누구를 참조하고 있니? 너가 참조하는 곳을 알려줘

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 자신이 STUDENTteacher 에 매핑되어 있으므로 teacher 로 설정해준 것이다.

추가적으로 @JoinTable 도 알아보도록 하자.

Reference

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

https://velog.io/@jduckling_1024/JoinColumn-vs-mappedBy

profile
I want be a developer🙂

0개의 댓글