JPA에서 1:N 양방향 관계인 Member와 Team 엔티티가 있다고 하자.
Team.class
@Entity
@Getter @Setter
public class Team {
@Id @GeneratedValue
@Column(name="team_id")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
Member.class
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
@Column(name="member_id")
private Long id;
@NotEmpty
private String name;
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
}
mappedBy는 연관 관계의 주인이 아닌 곳에 두어야 하니, Member에 두어야 한다.
mappedBy의 값으로는 주인 엔티티에 존재하는 본인 외래키 필드 명을 적으면 된다.
ex) Member.team
JoinColumn의 name 속성은 말 그래도 Member 엔티티에 존재하는 team이라는 필드를 어떤 이름으로 Member 테이블에 컬럼명으로 설정할 것인지를 나타내주는 것이다.
@JoinColumn(name="team_id") 라고 적었으면 그냥 Member 테이블에 team_id 라는 컬럼명이 정의되는 것이다.
Team 엔티티 경우에는 mappedBy를 통해서 Member 엔티티와의 연관 관계를 알 수 있지만, Member 엔티티 경우에는 어떻게 Team 엔티티와 연관 관계가 있다는 것을 알 수 있을까?
JoinColumn에서 referencedColumnName 속성을 생략하면 자동으로 대상 테이블의 pk 값으로 지정 되기 때문이다.
@JoinColumn(name = "team_id")
private Team team;
코드의 경우에는 referencedColumnName 속성을 생략했기에, Team 엔티티의 pk로 자동 지정이 된다.