@Entity
class User {
@Id
val id: Int,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id", nullable=false)
val team: Team
}
@Entity
class Team {
@Id
val id: Int,
}
이런식으로 User 여러 명 → 팀 하나에 속하는 단방향 매핑을 맺어주었다.
이렇게 되면 User는 자신의 팀을 찾을 수 있지만 Team은 속한 User들을 찾을 수 없다.
위에는 객체의 상황에서 이야기한 것이고 테이블은 다르다.
**외래키 하나만 있다면 양쪽 모두 참조가 가능
**하다.
객체에서 **테이블의 외래키처럼 하려면 단방향 매핑이 아닌 양방향 매핑
**을 맺어줘야 한다.
@Entity
class Team {
@Id
val id: Int,
@OneToMany(mappedBy="team")
val users = ArrayList<User>()
}
하나의 팀에 여러 명의 멤버가 올 수 있기 때문에 List 타입을 사용한다.
연관관계는 **master - slave 구조
**로 이루어진다. **외래키를 가지고 있는 쪽이 주인
**이다.
연관관계의 주인만 외래키를 관리할 수 있고 slave는 읽기만 가능하다. (Team은 Member의 team 컬럼 수정X)
연관관계의 **주인이 아닌 쪽에서 주인을 지정
**할 때 사용한다.
mappedBy는 주인이 자신을 가르키는 참조 필드의 이름을 명시한다. (위에서는 team)