객체와 DB의 패러다임 불일치

@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

연관관계의 **주인이 아닌 쪽에서 주인을 지정**할 때 사용한다.

mappedBy는 주인이 자신을 가르키는 참조 필드의 이름을 명시한다. (위에서는 team)

ManyToOne Master - Slave